1
The following changes since commit 6f625ce2f21d6a1243065d236298277c56f972d5:
1
The following changes since commit ae35f033b874c627d81d51070187fbf55f0bf1a7:
2
2
3
Merge tag 'pull-request-2024-10-21' of https://gitlab.com/thuth/qemu into staging (2024-10-21 17:12:59 +0100)
3
Update version for v9.2.0 release (2024-12-10 16:20:54 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20241024
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20241211
8
8
9
for you to fetch changes up to 1df52a9ac0897687cff7c38705007b2b58065042:
9
for you to fetch changes up to 124f4dc0d832c1bf3a4513c05a2b93bac0a5fac0:
10
10
11
test/qtest/aspeed_smc-test: Fix coding style (2024-10-24 07:57:47 +0200)
11
test/qtest/ast2700-smc-test: Support to test AST2700 (2024-12-11 07:25:53 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
aspeed queue:
14
aspeed queue:
15
15
16
* Fixed GPIO interrupt status when in index mode
16
* Removed tacoma-bmc machine
17
* Added GPIO support for the AST2700 SoC and specific test cases
17
* Added support for SDHCI on AST2700 SoC
18
* Fixed crypto controller (HACE) Accumulative hash function
18
* Improved functional tests
19
* Converted Aspeed machine avocado tests to the new functional
19
* Extended SMC qtest to all Aspeed SoCs
20
framework. SDK tests still to be addressed.
21
* Fixed issue in the SSI controller when doing writes in user mode
22
* Added support for the WRSR2 register of Winbond flash devices
23
* Added SFDP table for the Windbond w25q80bl flash device
24
* Changed flash device models for the ast1030-a1 EVB
25
20
26
----------------------------------------------------------------
21
----------------------------------------------------------------
27
Alejandro Zeise (1):
22
Cédric Le Goater (8):
28
hw/misc/aspeed_hace: Fix SG Accumulative hashing
23
arm: Remove tacoma-bmc machine
24
tests/functional: Introduce a specific test for ast1030 SoC
25
tests/functional: Introduce a specific test for palmetto-bmc machine
26
tests/functional: Introduce a specific test for romulus-bmc machine
27
tests/functional: Introduce a specific test for ast2500 SoC
28
tests/functional: Introduce a specific test for ast2600 SoC
29
tests/functional: Introduce a specific test for rainier-bmc machine
30
tests/functional: Move debian boot test from avocado
29
31
30
Cédric Le Goater (1):
32
Jamin Lin (16):
31
tests/functional: Convert most Aspeed machine tests
33
hw/sd/aspeed_sdhci: Fix coding style
34
hw/arm/aspeed: Fix coding style
35
hw:sdhci: Introduce a new "capareg" class member to set the different Capability Registers
36
hw/sd/aspeed_sdhci: Add AST2700 Support
37
aspeed/soc: Support SDHCI for AST2700
38
aspeed/soc: Support eMMC for AST2700
39
test/qtest/aspeed_smc-test: Move testcases to test_palmetto_bmc function
40
test/qtest/aspeed_smc-test: Introduce a new TestData to test different BMC SOCs
41
test/qtest/aspeed_smc-test: Support to test all CE pins
42
test/qtest/aspeed_smc-test: Introducing a "page_addr" data field
43
test/qtest/aspeed_smc-test: Support to test AST2500
44
test/qtest/aspeed_smc-test: Support to test AST2600
45
test/qtest/aspeed_smc-test: Support to test AST1030
46
test/qtest/aspeed_smc-test: Support write page command with QPI mode
47
test/qtest: Introduce a new aspeed-smc-utils.c to place common testcases
48
test/qtest/ast2700-smc-test: Support to test AST2700
32
49
33
Jamin Lin (15):
50
docs/about/deprecated.rst | 8 -
34
hw/gpio/aspeed: Fix coding style
51
docs/about/removed-features.rst | 10 +
35
hw/gpio/aspeed: Support to set the different memory size
52
docs/system/arm/aspeed.rst | 1 -
36
hw/gpio/aspeed: Support different memory region ops
53
include/hw/sd/aspeed_sdhci.h | 13 +-
37
hw/gpio/aspeed: Fix clear incorrect interrupt status for GPIO index mode
54
tests/qtest/aspeed-smc-utils.h | 95 ++++
38
hw/gpio/aspeed: Add AST2700 support
55
hw/arm/aspeed.c | 28 -
39
aspeed/soc: Correct GPIO irq 130 for AST2700
56
hw/arm/aspeed_ast2400.c | 3 +-
40
aspeed/soc: Support GPIO for AST2700
57
hw/arm/aspeed_ast2600.c | 10 +-
41
tests/qtest:ast2700-gpio-test: Add GPIO test case for AST2700
58
hw/arm/aspeed_ast27x0.c | 35 ++
42
aspeed/smc: Fix write incorrect data into flash in user mode
59
hw/sd/aspeed_sdhci.c | 67 ++-
43
hw/block:m25p80: Fix coding style
60
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++
44
hw/block:m25p80: Support write status register 2 command (0x31) for w25q01jvq
61
tests/qtest/aspeed_smc-test.c | 775 ++++++---------------------
45
hw/block/m25p80: Add SFDP table for w25q80bl flash
62
tests/qtest/ast2700-smc-test.c | 71 +++
46
hw/arm/aspeed: Correct spi_model w25q256 for ast1030-a1 EVB.
63
tests/avocado/boot_linux_console.py | 26 -
47
hw/arm/aspeed: Correct fmc_model w25q80bl for ast1030-a1 EVB
64
tests/functional/aspeed.py | 56 ++
48
test/qtest/aspeed_smc-test: Fix coding style
65
tests/functional/meson.build | 13 +-
49
66
tests/functional/test_arm_aspeed.py | 351 ------------
50
MAINTAINERS | 1 +
67
tests/functional/test_arm_aspeed_ast1030.py | 81 +++
51
hw/block/m25p80_sfdp.h | 2 +-
68
tests/functional/test_arm_aspeed_ast2500.py | 59 ++
52
include/hw/gpio/aspeed_gpio.h | 4 +-
69
tests/functional/test_arm_aspeed_ast2600.py | 143 +++++
53
include/hw/misc/aspeed_hace.h | 4 +
70
tests/functional/test_arm_aspeed_palmetto.py | 24 +
54
include/hw/ssi/aspeed_smc.h | 1 +
71
tests/functional/test_arm_aspeed_rainier.py | 64 +++
55
hw/arm/aspeed.c | 4 +-
72
tests/functional/test_arm_aspeed_romulus.py | 24 +
56
hw/arm/aspeed_ast27x0.c | 18 +-
73
tests/qtest/meson.build | 5 +-
57
hw/block/m25p80.c | 63 +++++-
74
24 files changed, 1623 insertions(+), 1025 deletions(-)
58
hw/block/m25p80_sfdp.c | 36 +++
75
create mode 100644 tests/qtest/aspeed-smc-utils.h
59
hw/gpio/aspeed_gpio.c | 427 ++++++++++++++++++++++++++++++++++--
76
create mode 100644 tests/qtest/aspeed-smc-utils.c
60
hw/misc/aspeed_hace.c | 104 +++++----
77
create mode 100644 tests/qtest/ast2700-smc-test.c
61
hw/ssi/aspeed_smc.c | 40 +++-
78
create mode 100644 tests/functional/aspeed.py
62
tests/qtest/aspeed_smc-test.c | 6 +-
79
delete mode 100755 tests/functional/test_arm_aspeed.py
63
tests/qtest/ast2700-gpio-test.c | 95 ++++++++
80
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
64
tests/avocado/machine_aspeed.py | 292 ------------------------
81
create mode 100644 tests/functional/test_arm_aspeed_ast2500.py
65
tests/functional/meson.build | 2 +
82
create mode 100644 tests/functional/test_arm_aspeed_ast2600.py
66
tests/functional/test_arm_aspeed.py | 282 ++++++++++++++++++++++++
83
create mode 100644 tests/functional/test_arm_aspeed_palmetto.py
67
tests/qtest/meson.build | 3 +
84
create mode 100644 tests/functional/test_arm_aspeed_rainier.py
68
18 files changed, 1002 insertions(+), 382 deletions(-)
85
create mode 100644 tests/functional/test_arm_aspeed_romulus.py
69
create mode 100644 tests/qtest/ast2700-gpio-test.c
70
create mode 100644 tests/functional/test_arm_aspeed.py
71
86
72
87
diff view generated by jsdifflib
New patch
1
Removal was scheduled for 10.0. Use the rainier-bmc machine or the
2
ast2600-evb as a replacement.
1
3
4
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Link: https://lore.kernel.org/r/20241119071352.515790-1-clg@redhat.com
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
docs/about/deprecated.rst | 8 --------
9
docs/about/removed-features.rst | 10 ++++++++++
10
docs/system/arm/aspeed.rst | 1 -
11
hw/arm/aspeed.c | 28 ----------------------------
12
4 files changed, 10 insertions(+), 37 deletions(-)
13
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
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/arm/aspeed.c
69
+++ b/hw/arm/aspeed.c
70
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
71
#define AST2700_EVB_HW_STRAP2 0x00000003
72
#endif
73
74
-/* Tacoma hardware value */
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
};
84
85
-static void aspeed_machine_tacoma_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
--
120
2.47.1
121
122
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Currently, the default fmc_model was "sst25vf032b" whose size was 4MB for
3
Fix coding style issues from checkpatch.pl.
4
ast1030-a1 EVB. However, according to the schematic of ast1030-a1 EVB,
5
ASPEED shipped default flash of fmc_cs0 and fmc_cs1 were "w25q80bl" and
6
"w25q256", respectively. The size of w25q80bl is 1MB and the size of w25q256
7
is 32MB.
8
9
The fmc_cs0 was connected to AST1030 A1 internal flash and the fmc_cs1 was
10
connected to external flash. The internal flash could not be changed because
11
it was placed into AST1030 A1 chip. Users only can change fmc_cs1 external
12
flash.
13
14
So far, only supports to set the default fmc_model for all chip select pins.
15
In other words, users cannot set the different default flash model for
16
fmc_cs0 and fmc_cs1, respectively.
17
18
Correct fmc_model default flash to w25q80bl the same as AST1030 A1
19
internal flash for ast1030-a1 EVB.
20
4
21
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
22
Reviewed-by: Cédric Le Goater <clg@redhat.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>
23
---
9
---
24
hw/arm/aspeed.c | 2 +-
10
hw/sd/aspeed_sdhci.c | 6 ++++--
25
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 4 insertions(+), 2 deletions(-)
26
12
27
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
13
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
28
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/arm/aspeed.c
15
--- a/hw/sd/aspeed_sdhci.c
30
+++ b/hw/arm/aspeed.c
16
+++ b/hw/sd/aspeed_sdhci.c
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
32
mc->init = aspeed_minibmc_machine_init;
18
sdhci->regs[TO_REG(addr)] = (uint32_t)val & ~ASPEED_SDHCI_INFO_RESET;
33
amc->i2c_init = ast1030_evb_i2c_init;
19
break;
34
mc->default_ram_size = 0;
20
case ASPEED_SDHCI_SDIO_140:
35
- amc->fmc_model = "sst25vf032b";
21
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 0, 32, val);
36
+ amc->fmc_model = "w25q80bl";
22
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
37
amc->spi_model = "w25q256";
23
+ 0, 32, val);
38
amc->num_cs = 2;
24
break;
39
amc->macs_mask = 0;
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,
40
--
32
--
41
2.47.0
33
2.47.1
42
34
43
35
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Currently, the default spi_model was "sst25vf032b" whose size was 4MB for
3
Fix coding style issues from checkpatch.pl.
4
ast1030-a1 EVB. However, according to the schematic of ast1030-a1 EVB,
5
ASPEED shipped default flash of spi1 and spi2 were w25q256 whose size
6
was 32MB.
7
8
Correct spi_model default flash to w25q256 for ast1030-a1 EVB.
9
4
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@redhat.com>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Link: https://lore.kernel.org/r/20241204084453.610660-3-jamin_lin@aspeedtech.com
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
---
9
---
13
hw/arm/aspeed.c | 2 +-
10
hw/arm/aspeed_ast2600.c | 3 ++-
14
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 2 insertions(+), 1 deletion(-)
15
12
16
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
13
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
17
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/aspeed.c
15
--- a/hw/arm/aspeed_ast2600.c
19
+++ b/hw/arm/aspeed.c
16
+++ b/hw/arm/aspeed_ast2600.c
20
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
21
amc->i2c_init = ast1030_evb_i2c_init;
18
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
22
mc->default_ram_size = 0;
19
return;
23
amc->fmc_model = "sst25vf032b";
20
}
24
- amc->spi_model = "sst25vf032b";
21
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_DEV_GPIO]);
25
+ amc->spi_model = "w25q256";
22
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0,
26
amc->num_cs = 2;
23
+ sc->memmap[ASPEED_DEV_GPIO]);
27
amc->macs_mask = 0;
24
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
28
aspeed_machine_class_init_cpus_defaults(mc);
25
aspeed_soc_get_irq(s, ASPEED_DEV_GPIO));
26
29
--
27
--
30
2.47.0
28
2.47.1
31
29
32
30
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
According to the datasheet of ASPEED SOCs, a GPIO controller owns 4KB of
3
Currently, it set the hardcode value of capability registers to all ASPEED SOCs
4
register space for AST2700, AST2500, AST2400 and AST1030; owns 2KB of
4
However, the value of capability registers should be different for all ASPEED
5
register space for AST2600 1.8v and owns 2KB of register space for
5
SOCs. For example: the bit 28 of the Capability Register 1 should be 1 for
6
AST2600 3.3v.
6
64-bits System Bus support for AST2700.
7
7
8
It set the memory region size 2KB by default and it does not compatible
8
Introduce a new "capareg" class member whose data type is uint_64 to set the
9
register space for AST2700.
9
different Capability Registers to all ASPEED SOCs.
10
10
11
Introduce a new class attribute to set the GPIO controller memory size
11
The value of Capability Register is "0x0000000001e80080" for AST2400 and
12
for different ASPEED SOCs.
12
AST2500. The value of Capability Register is "0x0000000701f80080" for AST2600.
13
13
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
16
Link: https://lore.kernel.org/r/20241204084453.610660-4-jamin_lin@aspeedtech.com
17
Signed-off-by: Cédric Le Goater <clg@redhat.com>
16
---
18
---
17
include/hw/gpio/aspeed_gpio.h | 1 +
19
include/hw/sd/aspeed_sdhci.h | 12 +++++++--
18
hw/gpio/aspeed_gpio.c | 7 ++++++-
20
hw/arm/aspeed_ast2400.c | 3 ++-
19
2 files changed, 7 insertions(+), 1 deletion(-)
21
hw/arm/aspeed_ast2600.c | 7 +++---
22
hw/sd/aspeed_sdhci.c | 47 +++++++++++++++++++++++++++++++++++-
23
4 files changed, 61 insertions(+), 8 deletions(-)
20
24
21
diff --git a/include/hw/gpio/aspeed_gpio.h b/include/hw/gpio/aspeed_gpio.h
25
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
22
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
23
--- a/include/hw/gpio/aspeed_gpio.h
27
--- a/include/hw/sd/aspeed_sdhci.h
24
+++ b/include/hw/gpio/aspeed_gpio.h
28
+++ b/include/hw/sd/aspeed_sdhci.h
25
@@ -XXX,XX +XXX,XX @@ struct AspeedGPIOClass {
29
@@ -XXX,XX +XXX,XX @@
26
uint32_t nr_gpio_sets;
30
#include "qom/object.h"
27
const AspeedGPIOReg *reg_table;
31
28
unsigned reg_table_count;
32
#define TYPE_ASPEED_SDHCI "aspeed.sdhci"
29
+ uint64_t mem_size;
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];
30
};
45
};
31
46
32
struct AspeedGPIOState {
47
+struct AspeedSDHCIClass {
33
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
48
+ SysBusDeviceClass parent_class;
49
+
50
+ uint64_t capareg;
51
+};
52
+
53
#endif /* ASPEED_SDHCI_H */
54
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
34
index XXXXXXX..XXXXXXX 100644
55
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/gpio/aspeed_gpio.c
56
--- a/hw/arm/aspeed_ast2400.c
36
+++ b/hw/gpio/aspeed_gpio.c
57
+++ b/hw/arm/aspeed_ast2400.c
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_realize(DeviceState *dev, Error **errp)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
59
snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
60
object_initialize_child(obj, "gpio", &s->gpio, typename);
61
62
- object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
63
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
64
+ object_initialize_child(obj, "sdc", &s->sdhci, typename);
65
66
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
67
68
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
69
index XXXXXXX..XXXXXXX 100644
70
--- a/hw/arm/aspeed_ast2600.c
71
+++ b/hw/arm/aspeed_ast2600.c
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
73
snprintf(typename, sizeof(typename), "aspeed.gpio-%s-1_8v", socname);
74
object_initialize_child(obj, "gpio_1_8v", &s->gpio_1_8v, typename);
75
76
- object_initialize_child(obj, "sd-controller", &s->sdhci,
77
- TYPE_ASPEED_SDHCI);
78
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
79
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
80
81
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
82
83
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
84
&s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
38
}
85
}
39
86
40
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s,
87
- object_initialize_child(obj, "emmc-controller", &s->emmc,
41
- TYPE_ASPEED_GPIO, 0x800);
88
- TYPE_ASPEED_SDHCI);
42
+ TYPE_ASPEED_GPIO, agc->mem_size);
89
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
43
90
44
sysbus_init_mmio(sbd, &s->iomem);
91
object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
92
93
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
94
index XXXXXXX..XXXXXXX 100644
95
--- a/hw/sd/aspeed_sdhci.c
96
+++ b/hw/sd/aspeed_sdhci.c
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
98
{
99
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
100
AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
101
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_GET_CLASS(sdhci);
102
103
/* Create input irqs for the slots */
104
qdev_init_gpio_in_named_with_opaque(DEVICE(sbd), aspeed_sdhci_set_irq,
105
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
106
}
107
108
if (!object_property_set_uint(sdhci_slot, "capareg",
109
- ASPEED_SDHCI_CAPABILITIES, errp)) {
110
+ asc->capareg, errp)) {
111
return;
112
}
113
114
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_class_init(ObjectClass *classp, void *data)
115
device_class_set_props(dc, aspeed_sdhci_properties);
45
}
116
}
46
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_ast2400_class_init(ObjectClass *klass, void *data)
117
47
agc->nr_gpio_sets = 7;
118
+static void aspeed_2400_sdhci_class_init(ObjectClass *klass, void *data)
48
agc->reg_table = aspeed_3_3v_gpios;
119
+{
49
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
120
+ DeviceClass *dc = DEVICE_CLASS(klass);
50
+ agc->mem_size = 0x1000;
121
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
51
}
122
+
52
123
+ dc->desc = "ASPEED 2400 SDHCI Controller";
53
static void aspeed_gpio_2500_class_init(ObjectClass *klass, void *data)
124
+ asc->capareg = 0x0000000001e80080;
54
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_2500_class_init(ObjectClass *klass, void *data)
125
+}
55
agc->nr_gpio_sets = 8;
126
+
56
agc->reg_table = aspeed_3_3v_gpios;
127
+static void aspeed_2500_sdhci_class_init(ObjectClass *klass, void *data)
57
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
128
+{
58
+ agc->mem_size = 0x1000;
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
59
}
130
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
60
131
+
61
static void aspeed_gpio_ast2600_3_3v_class_init(ObjectClass *klass, void *data)
132
+ dc->desc = "ASPEED 2500 SDHCI Controller";
62
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_ast2600_3_3v_class_init(ObjectClass *klass, void *data)
133
+ asc->capareg = 0x0000000001e80080;
63
agc->nr_gpio_sets = 7;
134
+}
64
agc->reg_table = aspeed_3_3v_gpios;
135
+
65
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
136
+static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
66
+ agc->mem_size = 0x800;
137
+{
67
}
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
68
139
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
69
static void aspeed_gpio_ast2600_1_8v_class_init(ObjectClass *klass, void *data)
140
+
70
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_ast2600_1_8v_class_init(ObjectClass *klass, void *data)
141
+ dc->desc = "ASPEED 2600 SDHCI Controller";
71
agc->nr_gpio_sets = 2;
142
+ asc->capareg = 0x0000000701f80080;
72
agc->reg_table = aspeed_1_8v_gpios;
143
+}
73
agc->reg_table_count = GPIO_1_8V_REG_ARRAY_SIZE;
144
+
74
+ agc->mem_size = 0x800;
145
static const TypeInfo aspeed_sdhci_types[] = {
75
}
146
{
76
147
.name = TYPE_ASPEED_SDHCI,
77
static void aspeed_gpio_1030_class_init(ObjectClass *klass, void *data)
148
.parent = TYPE_SYS_BUS_DEVICE,
78
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_1030_class_init(ObjectClass *klass, void *data)
149
.instance_size = sizeof(AspeedSDHCIState),
79
agc->nr_gpio_sets = 6;
150
.class_init = aspeed_sdhci_class_init,
80
agc->reg_table = aspeed_3_3v_gpios;
151
+ .class_size = sizeof(AspeedSDHCIClass),
81
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
152
+ .abstract = true,
82
+ agc->mem_size = 0x1000;
153
+ },
83
}
154
+ {
84
155
+ .name = TYPE_ASPEED_2400_SDHCI,
85
static const TypeInfo aspeed_gpio_info = {
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
86
--
171
--
87
2.47.0
172
2.47.1
88
173
89
174
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Add the SFDP table for the Windbond w25q80bl flash.
3
Introduce a new ast2700 class to support AST2700. Add a new ast2700 SDHCI class
4
init function and set the value of capability register to "0x0000000719f80080".
4
5
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Link: https://lore.kernel.org/r/20241204084453.610660-5-jamin_lin@aspeedtech.com
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
10
---
8
hw/block/m25p80_sfdp.h | 2 +-
11
include/hw/sd/aspeed_sdhci.h | 1 +
9
hw/block/m25p80.c | 3 ++-
12
hw/sd/aspeed_sdhci.c | 14 ++++++++++++++
10
hw/block/m25p80_sfdp.c | 36 ++++++++++++++++++++++++++++++++++++
13
2 files changed, 15 insertions(+)
11
3 files changed, 39 insertions(+), 2 deletions(-)
12
14
13
diff --git a/hw/block/m25p80_sfdp.h b/hw/block/m25p80_sfdp.h
15
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/block/m25p80_sfdp.h
17
--- a/include/hw/sd/aspeed_sdhci.h
16
+++ b/hw/block/m25p80_sfdp.h
18
+++ b/include/hw/sd/aspeed_sdhci.h
17
@@ -XXX,XX +XXX,XX @@ uint8_t m25p80_sfdp_mx66l1g45g(uint32_t addr);
19
@@ -XXX,XX +XXX,XX @@
18
20
#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
19
uint8_t m25p80_sfdp_w25q256(uint32_t addr);
21
#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
20
uint8_t m25p80_sfdp_w25q512jv(uint32_t addr);
22
#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
21
-
23
+#define TYPE_ASPEED_2700_SDHCI TYPE_ASPEED_SDHCI "-ast2700"
22
+uint8_t m25p80_sfdp_w25q80bl(uint32_t addr);
24
OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
23
uint8_t m25p80_sfdp_w25q01jvq(uint32_t addr);
25
24
26
#define ASPEED_SDHCI_NUM_SLOTS 2
25
uint8_t m25p80_sfdp_is25wp256(uint32_t addr);
27
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
26
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
27
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/block/m25p80.c
29
--- a/hw/sd/aspeed_sdhci.c
29
+++ b/hw/block/m25p80.c
30
+++ b/hw/sd/aspeed_sdhci.c
30
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
31
{ INFO("w25x64", 0xef3017, 0, 64 << 10, 128, ER_4K) },
32
asc->capareg = 0x0000000701f80080;
32
{ INFO("w25q64", 0xef4017, 0, 64 << 10, 128, ER_4K) },
33
}
33
{ INFO("w25q80", 0xef5014, 0, 64 << 10, 16, ER_4K) },
34
34
- { INFO("w25q80bl", 0xef4014, 0, 64 << 10, 16, ER_4K) },
35
+static void aspeed_2700_sdhci_class_init(ObjectClass *klass, void *data)
35
+ { INFO("w25q80bl", 0xef4014, 0, 64 << 10, 16, ER_4K),
36
+{
36
+ .sfdp_read = m25p80_sfdp_w25q80bl },
37
+ DeviceClass *dc = DEVICE_CLASS(klass);
37
{ INFO("w25q256", 0xef4019, 0, 64 << 10, 512, ER_4K),
38
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
38
.sfdp_read = m25p80_sfdp_w25q256 },
39
+
39
{ INFO("w25q512jv", 0xef4020, 0, 64 << 10, 1024, ER_4K),
40
+ dc->desc = "ASPEED 2700 SDHCI Controller";
40
diff --git a/hw/block/m25p80_sfdp.c b/hw/block/m25p80_sfdp.c
41
+ asc->capareg = 0x0000000719f80080;
41
index XXXXXXX..XXXXXXX 100644
42
+}
42
--- a/hw/block/m25p80_sfdp.c
43
+
43
+++ b/hw/block/m25p80_sfdp.c
44
static const TypeInfo aspeed_sdhci_types[] = {
44
@@ -XXX,XX +XXX,XX @@ static const uint8_t sfdp_w25q01jvq[] = {
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
+ },
45
};
56
};
46
define_sfdp_read(w25q01jvq);
57
47
58
DEFINE_TYPES(aspeed_sdhci_types)
48
+static const uint8_t sfdp_w25q80bl[] = {
49
+ 0x53, 0x46, 0x44, 0x50, 0x05, 0x01, 0x00, 0xff,
50
+ 0x00, 0x05, 0x01, 0x10, 0x80, 0x00, 0x00, 0xff,
51
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
52
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
53
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
54
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
55
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
56
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
57
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
58
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
59
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
60
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
61
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
62
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
63
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
64
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
65
+ 0xe5, 0x20, 0xf1, 0xff, 0xff, 0xff, 0x7f, 0x00,
66
+ 0x44, 0xeb, 0x08, 0x6b, 0x08, 0x3b, 0x42, 0xbb,
67
+ 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
68
+ 0xff, 0xff, 0x00, 0x00, 0x0c, 0x20, 0x0f, 0x52,
69
+ 0x10, 0xd8, 0x00, 0x00, 0x23, 0x02, 0xa6, 0x00,
70
+ 0x81, 0x6c, 0x14, 0xa7, 0xed, 0x61, 0x76, 0x33,
71
+ 0x7a, 0x75, 0x7a, 0x75, 0xf7, 0xa2, 0xd5, 0x5c,
72
+ 0x00, 0xf7, 0x1d, 0xff, 0xe9, 0x30, 0xc0, 0x80,
73
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
74
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
75
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
76
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
77
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
78
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
79
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
80
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
81
+};
82
+define_sfdp_read(w25q80bl);
83
+
84
/*
85
* Integrated Silicon Solution (ISSI)
86
*/
87
--
59
--
88
2.47.0
60
2.47.1
89
61
90
62
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Add GPIO model for AST2700 GPIO support. The GPIO controller registers base
3
Add SDHCI model for AST2700 SDHCI support. The SDHCI controller only support 1
4
address is start at 0x14C0_B000 and its address space is 0x1000.
4
slot and registers base address is start at 0x1408_0000 and its interrupt is
5
connected to GICINT133_INTC at bit 1.
5
6
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Link: https://lore.kernel.org/r/20241204084453.610660-6-jamin_lin@aspeedtech.com
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
11
---
9
hw/arm/aspeed_ast27x0.c | 13 +++++++++++++
12
hw/arm/aspeed_ast27x0.c | 20 ++++++++++++++++++++
10
1 file changed, 13 insertions(+)
13
1 file changed, 20 insertions(+)
11
14
12
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/arm/aspeed_ast27x0.c
17
--- a/hw/arm/aspeed_ast27x0.c
15
+++ b/hw/arm/aspeed_ast27x0.c
18
+++ b/hw/arm/aspeed_ast27x0.c
16
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
19
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
17
[ASPEED_GIC_REDIST] = 0x12280000,
18
[ASPEED_DEV_ADC] = 0x14C00000,
19
[ASPEED_DEV_I2C] = 0x14C0F000,
20
[ASPEED_DEV_I2C] = 0x14C0F000,
20
+ [ASPEED_DEV_GPIO] = 0x14C0B000,
21
[ASPEED_DEV_GPIO] = 0x14C0B000,
22
[ASPEED_DEV_RTC] = 0x12C0F000,
23
+ [ASPEED_DEV_SDHCI] = 0x14080000,
21
};
24
};
22
25
23
#define AST2700_MAX_IRQ 288
26
#define AST2700_MAX_IRQ 256
27
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_irqmap[] = {
28
[ASPEED_DEV_KCS] = 128,
29
[ASPEED_DEV_DP] = 28,
30
[ASPEED_DEV_I3C] = 131,
31
+ [ASPEED_DEV_SDHCI] = 133,
32
};
33
34
/* GICINT 128 */
35
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_gic132_intcmap[] = {
36
37
/* GICINT 133 */
38
static const int aspeed_soc_ast2700_gic133_intcmap[] = {
39
+ [ASPEED_DEV_SDHCI] = 1,
40
[ASPEED_DEV_PECI] = 4,
41
};
42
24
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
25
44
object_initialize_child(obj, "gpio", &s->gpio, typename);
26
snprintf(typename, sizeof(typename), "aspeed.i2c-%s", socname);
45
27
object_initialize_child(obj, "i2c", &s->i2c, typename);
46
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
28
+
47
+
29
+ snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
48
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
30
+ object_initialize_child(obj, "gpio", &s->gpio, typename);
49
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
50
+ object_property_set_int(OBJECT(&s->sdhci), "num-slots", 1, &error_abort);
51
+
52
+ /* Init sd card slot class here so that they're under the correct parent */
53
+ object_initialize_child(obj, "sd-controller.sdhci",
54
+ &s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
31
}
55
}
32
56
33
/*
57
/*
34
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
35
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c.busses[i]), 0, irq);
59
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
36
}
60
aspeed_soc_get_irq(s, ASPEED_DEV_RTC));
37
61
38
+ /* GPIO */
62
+ /* SDHCI */
39
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
63
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
40
+ return;
64
+ return;
41
+ }
65
+ }
42
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0,
66
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sdhci), 0,
43
+ sc->memmap[ASPEED_DEV_GPIO]);
67
+ sc->memmap[ASPEED_DEV_SDHCI]);
44
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
68
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
45
+ aspeed_soc_get_irq(s, ASPEED_DEV_GPIO));
69
+ aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
46
+
70
+
47
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
71
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
48
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
72
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
49
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
73
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
50
--
74
--
51
2.47.0
75
2.47.1
52
76
53
77
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
The register set of GPIO have a significant change since AST2700.
3
Add SDHCI model for AST2700 eMMC support. The eMMC controller only support 1
4
Each GPIO pin has their own individual control register and users are able to
4
slot and registers base address is start at 0x1209_0000 and its interrupt is
5
set one GPIO pin’s direction, interrupt enable, input mask and so on in the
5
connected to GICINT 15.
6
same one control register.
7
8
AST2700 does not have GPIO18_XXX registers for GPIO 1.8v, removes
9
ASPEED_DEV_GPIO_1_8V. It is enough to only have ASPEED_DEV_GPIO
10
device in AST2700.
11
12
The AST2700 GPIO controller interrupt is connected to GICINT130_INTC at
13
bit 18. Therefore, correct GPIO irq 130.
14
6
15
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
16
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Link: https://lore.kernel.org/r/20241204084453.610660-7-jamin_lin@aspeedtech.com
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
17
---
11
---
18
hw/arm/aspeed_ast27x0.c | 5 ++---
12
hw/arm/aspeed_ast27x0.c | 15 +++++++++++++++
19
1 file changed, 2 insertions(+), 3 deletions(-)
13
1 file changed, 15 insertions(+)
20
14
21
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
22
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
23
--- a/hw/arm/aspeed_ast27x0.c
17
--- a/hw/arm/aspeed_ast27x0.c
24
+++ b/hw/arm/aspeed_ast27x0.c
18
+++ b/hw/arm/aspeed_ast27x0.c
25
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_irqmap[] = {
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
26
[ASPEED_DEV_ADC] = 130,
20
/* Init sd card slot class here so that they're under the correct parent */
27
[ASPEED_DEV_XDMA] = 5,
21
object_initialize_child(obj, "sd-controller.sdhci",
28
[ASPEED_DEV_EMMC] = 15,
22
&s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
29
- [ASPEED_DEV_GPIO] = 11,
23
+
30
- [ASPEED_DEV_GPIO_1_8V] = 130,
24
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
31
+ [ASPEED_DEV_GPIO] = 130,
25
+ object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
32
[ASPEED_DEV_RTC] = 13,
26
+
33
[ASPEED_DEV_TIMER1] = 16,
27
+ object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
34
[ASPEED_DEV_TIMER2] = 17,
28
+ TYPE_SYSBUS_SDHCI);
35
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2700_gic128_intcmap[] = {
29
}
36
static const int aspeed_soc_ast2700_gic130_intcmap[] = {
30
37
[ASPEED_DEV_I2C] = 0,
31
/*
38
[ASPEED_DEV_ADC] = 16,
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
39
- [ASPEED_DEV_GPIO_1_8V] = 18,
33
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
40
+ [ASPEED_DEV_GPIO] = 18,
34
aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
41
};
35
42
36
+ /* eMMC */
43
/* GICINT 131 */
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);
44
--
48
--
45
2.47.0
49
2.47.1
46
50
47
51
diff view generated by jsdifflib
New patch
1
This simply moves the ast1030 tests to a new test file. No changes.
1
2
3
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
Link: https://lore.kernel.org/r/20241206131132.520911-2-clg@redhat.com
5
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
7
tests/functional/meson.build | 1 +
8
tests/functional/test_arm_aspeed.py | 64 ----------------
9
tests/functional/test_arm_aspeed_ast1030.py | 81 +++++++++++++++++++++
10
3 files changed, 82 insertions(+), 64 deletions(-)
11
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
12
13
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
14
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/functional/meson.build
16
+++ b/tests/functional/meson.build
17
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
18
19
tests_arm_system_thorough = [
20
'arm_aspeed',
21
+ 'arm_aspeed_ast1030',
22
'arm_bpim2u',
23
'arm_canona1100',
24
'arm_collie',
25
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
26
index XXXXXXX..XXXXXXX 100755
27
--- a/tests/functional/test_arm_aspeed.py
28
+++ b/tests/functional/test_arm_aspeed.py
29
@@ -XXX,XX +XXX,XX @@
30
from zipfile import ZipFile
31
from unittest import skipUnless
32
33
-class AST1030Machine(LinuxKernelTest):
34
-
35
- ASSET_ZEPHYR_1_04 = Asset(
36
- ('https://github.com/AspeedTech-BMC'
37
- '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
38
- '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
39
-
40
- def test_ast1030_zephyros_1_04(self):
41
- self.set_machine('ast1030-evb')
42
-
43
- zip_file = self.ASSET_ZEPHYR_1_04.fetch()
44
-
45
- kernel_name = "ast1030-evb-demo/zephyr.elf"
46
- with ZipFile(zip_file, 'r') as zf:
47
- zf.extract(kernel_name, path=self.workdir)
48
- kernel_file = os.path.join(self.workdir, kernel_name)
49
-
50
- self.vm.set_console()
51
- self.vm.add_args('-kernel', kernel_file, '-nographic')
52
- self.vm.launch()
53
- self.wait_for_console_pattern("Booting Zephyr OS")
54
- exec_command_and_wait_for_pattern(self, "help",
55
- "Available commands")
56
-
57
- ASSET_ZEPHYR_1_07 = Asset(
58
- ('https://github.com/AspeedTech-BMC'
59
- '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
60
- 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
61
-
62
- def test_ast1030_zephyros_1_07(self):
63
- self.set_machine('ast1030-evb')
64
-
65
- zip_file = self.ASSET_ZEPHYR_1_07.fetch()
66
-
67
- kernel_name = "ast1030-evb-demo/zephyr.bin"
68
- with ZipFile(zip_file, 'r') as zf:
69
- zf.extract(kernel_name, path=self.workdir)
70
- kernel_file = os.path.join(self.workdir, kernel_name)
71
-
72
- self.vm.set_console()
73
- self.vm.add_args('-kernel', kernel_file, '-nographic')
74
- self.vm.launch()
75
- self.wait_for_console_pattern("Booting Zephyr OS")
76
- for shell_cmd in [
77
- 'kernel stacks',
78
- 'otp info conf',
79
- 'otp info scu',
80
- 'hwinfo devid',
81
- 'crypto aes256_cbc_vault',
82
- 'random get',
83
- 'jtag JTAG1 sw_xfer high TMS',
84
- 'adc ADC0 resolution 12',
85
- 'adc ADC0 read 42',
86
- 'adc ADC1 read 69',
87
- 'i2c scan I2C_0',
88
- 'i3c attach I3C_0',
89
- 'hash test',
90
- 'kernel uptime',
91
- 'kernel reboot warm',
92
- 'kernel uptime',
93
- 'kernel reboot cold',
94
- 'kernel uptime',
95
- ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
96
-
97
class AST2x00Machine(LinuxKernelTest):
98
99
def do_test_arm_aspeed(self, machine, image):
100
diff --git a/tests/functional/test_arm_aspeed_ast1030.py b/tests/functional/test_arm_aspeed_ast1030.py
101
new file mode 100644
102
index XXXXXXX..XXXXXXX
103
--- /dev/null
104
+++ b/tests/functional/test_arm_aspeed_ast1030.py
105
@@ -XXX,XX +XXX,XX @@
106
+#!/usr/bin/env python3
107
+#
108
+# Functional test that boots the ASPEED SoCs with firmware
109
+#
110
+# Copyright (C) 2022 ASPEED Technology Inc
111
+#
112
+# SPDX-License-Identifier: GPL-2.0-or-later
113
+
114
+import os
115
+
116
+from qemu_test import LinuxKernelTest, Asset
117
+from qemu_test import exec_command_and_wait_for_pattern
118
+from zipfile import ZipFile
119
+
120
+class AST1030Machine(LinuxKernelTest):
121
+
122
+ ASSET_ZEPHYR_1_04 = Asset(
123
+ ('https://github.com/AspeedTech-BMC'
124
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
125
+ '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
126
+
127
+ def test_ast1030_zephyros_1_04(self):
128
+ self.set_machine('ast1030-evb')
129
+
130
+ zip_file = self.ASSET_ZEPHYR_1_04.fetch()
131
+
132
+ kernel_name = "ast1030-evb-demo/zephyr.elf"
133
+ with ZipFile(zip_file, 'r') as zf:
134
+ zf.extract(kernel_name, path=self.workdir)
135
+ kernel_file = os.path.join(self.workdir, kernel_name)
136
+
137
+ self.vm.set_console()
138
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
139
+ self.vm.launch()
140
+ self.wait_for_console_pattern("Booting Zephyr OS")
141
+ exec_command_and_wait_for_pattern(self, "help",
142
+ "Available commands")
143
+
144
+ ASSET_ZEPHYR_1_07 = Asset(
145
+ ('https://github.com/AspeedTech-BMC'
146
+ '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
147
+ 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
148
+
149
+ def test_ast1030_zephyros_1_07(self):
150
+ self.set_machine('ast1030-evb')
151
+
152
+ zip_file = self.ASSET_ZEPHYR_1_07.fetch()
153
+
154
+ kernel_name = "ast1030-evb-demo/zephyr.bin"
155
+ with ZipFile(zip_file, 'r') as zf:
156
+ zf.extract(kernel_name, path=self.workdir)
157
+ kernel_file = os.path.join(self.workdir, kernel_name)
158
+
159
+ self.vm.set_console()
160
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
161
+ self.vm.launch()
162
+ self.wait_for_console_pattern("Booting Zephyr OS")
163
+ for shell_cmd in [
164
+ 'kernel stacks',
165
+ 'otp info conf',
166
+ 'otp info scu',
167
+ 'hwinfo devid',
168
+ 'crypto aes256_cbc_vault',
169
+ 'random get',
170
+ 'jtag JTAG1 sw_xfer high TMS',
171
+ 'adc ADC0 resolution 12',
172
+ 'adc ADC0 read 42',
173
+ 'adc ADC1 read 69',
174
+ 'i2c scan I2C_0',
175
+ 'i3c attach I3C_0',
176
+ 'hash test',
177
+ 'kernel uptime',
178
+ 'kernel reboot warm',
179
+ 'kernel uptime',
180
+ 'kernel reboot cold',
181
+ 'kernel uptime',
182
+ ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
183
+
184
+
185
+if __name__ == '__main__':
186
+ LinuxKernelTest.main()
187
--
188
2.47.1
189
190
diff view generated by jsdifflib
New patch
1
This introduces a new aspeed module for sharing code between tests and
2
moves the palmetto test to a new test file. No changes in the test.
1
3
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
5
Link: https://lore.kernel.org/r/20241206131132.520911-3-clg@redhat.com
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
tests/functional/aspeed.py | 23 +++++++++++++++++++
9
tests/functional/meson.build | 2 ++
10
tests/functional/test_arm_aspeed.py | 10 --------
11
tests/functional/test_arm_aspeed_palmetto.py | 24 ++++++++++++++++++++
12
4 files changed, 49 insertions(+), 10 deletions(-)
13
create mode 100644 tests/functional/aspeed.py
14
create mode 100644 tests/functional/test_arm_aspeed_palmetto.py
15
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/tests/functional/aspeed.py
21
@@ -XXX,XX +XXX,XX @@
22
+# Test class to boot aspeed machines
23
+#
24
+# SPDX-License-Identifier: GPL-2.0-or-later
25
+
26
+from qemu_test import LinuxKernelTest
27
+
28
+class AspeedTest(LinuxKernelTest):
29
+
30
+ def do_test_arm_aspeed(self, machine, image):
31
+ self.set_machine(machine)
32
+ self.vm.set_console()
33
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
34
+ '-net', 'nic', '-snapshot')
35
+ self.vm.launch()
36
+
37
+ self.wait_for_console_pattern("U-Boot 2016.07")
38
+ self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
39
+ self.wait_for_console_pattern("Starting kernel ...")
40
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
41
+ self.wait_for_console_pattern(
42
+ "aspeed-smc 1e620000.spi: read control register: 203b0641")
43
+ self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
44
+ self.wait_for_console_pattern("systemd[1]: Set hostname to")
45
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
46
index XXXXXXX..XXXXXXX 100644
47
--- a/tests/functional/meson.build
48
+++ b/tests/functional/meson.build
49
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
50
'aarch64_tuxrun' : 240,
51
'aarch64_virt' : 720,
52
'acpi_bits' : 420,
53
+ 'arm_aspeed_palmetto' : 120,
54
'arm_aspeed' : 600,
55
'arm_bpim2u' : 500,
56
'arm_collie' : 180,
57
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
58
tests_arm_system_thorough = [
59
'arm_aspeed',
60
'arm_aspeed_ast1030',
61
+ 'arm_aspeed_palmetto',
62
'arm_bpim2u',
63
'arm_canona1100',
64
'arm_collie',
65
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
66
index XXXXXXX..XXXXXXX 100755
67
--- a/tests/functional/test_arm_aspeed.py
68
+++ b/tests/functional/test_arm_aspeed.py
69
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed(self, machine, image):
70
self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
71
self.wait_for_console_pattern("systemd[1]: Set hostname to")
72
73
- ASSET_PALMETTO_FLASH = Asset(
74
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
75
- 'obmc-phosphor-image-palmetto.static.mtd'),
76
- '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
77
-
78
- def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
79
- image_path = self.ASSET_PALMETTO_FLASH.fetch()
80
-
81
- self.do_test_arm_aspeed('palmetto-bmc', image_path)
82
-
83
ASSET_ROMULUS_FLASH = Asset(
84
('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
85
'obmc-phosphor-image-romulus.static.mtd'),
86
diff --git a/tests/functional/test_arm_aspeed_palmetto.py b/tests/functional/test_arm_aspeed_palmetto.py
87
new file mode 100644
88
index XXXXXXX..XXXXXXX
89
--- /dev/null
90
+++ b/tests/functional/test_arm_aspeed_palmetto.py
91
@@ -XXX,XX +XXX,XX @@
92
+#!/usr/bin/env python3
93
+#
94
+# Functional test that boots the ASPEED machines
95
+#
96
+# SPDX-License-Identifier: GPL-2.0-or-later
97
+
98
+from qemu_test import Asset
99
+from aspeed import AspeedTest
100
+
101
+class PalmettoMachine(AspeedTest):
102
+
103
+ ASSET_PALMETTO_FLASH = Asset(
104
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
105
+ 'obmc-phosphor-image-palmetto.static.mtd'),
106
+ '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
107
+
108
+ def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
109
+ image_path = self.ASSET_PALMETTO_FLASH.fetch()
110
+
111
+ self.do_test_arm_aspeed('palmetto-bmc', image_path)
112
+
113
+
114
+if __name__ == '__main__':
115
+ AspeedTest.main()
116
--
117
2.47.1
118
119
diff view generated by jsdifflib
New patch
1
This simply moves the romulus-bmc test to a new test file. No changes
2
in the test. The do_test_arm_aspeed routine is removed from the
3
test_arm_aspeed.py file because it is now unused.
1
4
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Link: https://lore.kernel.org/r/20241206131132.520911-4-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
9
tests/functional/meson.build | 2 ++
10
tests/functional/test_arm_aspeed.py | 26 ---------------------
11
tests/functional/test_arm_aspeed_romulus.py | 24 +++++++++++++++++++
12
3 files changed, 26 insertions(+), 26 deletions(-)
13
create mode 100644 tests/functional/test_arm_aspeed_romulus.py
14
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
16
index XXXXXXX..XXXXXXX 100644
17
--- a/tests/functional/meson.build
18
+++ b/tests/functional/meson.build
19
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
20
'aarch64_virt' : 720,
21
'acpi_bits' : 420,
22
'arm_aspeed_palmetto' : 120,
23
+ 'arm_aspeed_romulus' : 120,
24
'arm_aspeed' : 600,
25
'arm_bpim2u' : 500,
26
'arm_collie' : 180,
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
28
'arm_aspeed',
29
'arm_aspeed_ast1030',
30
'arm_aspeed_palmetto',
31
+ 'arm_aspeed_romulus',
32
'arm_bpim2u',
33
'arm_canona1100',
34
'arm_collie',
35
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
36
index XXXXXXX..XXXXXXX 100755
37
--- a/tests/functional/test_arm_aspeed.py
38
+++ b/tests/functional/test_arm_aspeed.py
39
@@ -XXX,XX +XXX,XX @@
40
41
class AST2x00Machine(LinuxKernelTest):
42
43
- def do_test_arm_aspeed(self, machine, image):
44
- self.set_machine(machine)
45
- self.vm.set_console()
46
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
47
- '-net', 'nic', '-snapshot')
48
- self.vm.launch()
49
-
50
- self.wait_for_console_pattern("U-Boot 2016.07")
51
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
52
- self.wait_for_console_pattern("Starting kernel ...")
53
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
54
- self.wait_for_console_pattern(
55
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
56
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
57
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
58
-
59
- ASSET_ROMULUS_FLASH = Asset(
60
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
61
- 'obmc-phosphor-image-romulus.static.mtd'),
62
- '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
63
-
64
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
65
- image_path = self.ASSET_ROMULUS_FLASH.fetch()
66
-
67
- self.do_test_arm_aspeed('romulus-bmc', image_path)
68
-
69
def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
70
self.require_netdev('user')
71
self.vm.set_console()
72
diff --git a/tests/functional/test_arm_aspeed_romulus.py b/tests/functional/test_arm_aspeed_romulus.py
73
new file mode 100644
74
index XXXXXXX..XXXXXXX
75
--- /dev/null
76
+++ b/tests/functional/test_arm_aspeed_romulus.py
77
@@ -XXX,XX +XXX,XX @@
78
+#!/usr/bin/env python3
79
+#
80
+# Functional test that boots the ASPEED machines
81
+#
82
+# SPDX-License-Identifier: GPL-2.0-or-later
83
+
84
+from qemu_test import Asset
85
+from aspeed import AspeedTest
86
+
87
+class RomulusMachine(AspeedTest):
88
+
89
+ ASSET_ROMULUS_FLASH = Asset(
90
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
91
+ 'obmc-phosphor-image-romulus.static.mtd'),
92
+ '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
93
+
94
+ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
95
+ image_path = self.ASSET_ROMULUS_FLASH.fetch()
96
+
97
+ self.do_test_arm_aspeed('romulus-bmc', image_path)
98
+
99
+
100
+if __name__ == '__main__':
101
+ AspeedTest.main()
102
--
103
2.47.1
104
105
diff view generated by jsdifflib
New patch
1
1
This moves the ast2500-evb tests to a new test file and extends the
2
aspeed module with routines used to run the buildroot and sdk
3
tests. No changes in the test.
4
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Link: https://lore.kernel.org/r/20241206131132.520911-5-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
9
tests/functional/aspeed.py | 33 ++++++++++++
10
tests/functional/meson.build | 2 +
11
tests/functional/test_arm_aspeed.py | 44 ---------------
12
tests/functional/test_arm_aspeed_ast2500.py | 59 +++++++++++++++++++++
13
4 files changed, 94 insertions(+), 44 deletions(-)
14
create mode 100644 tests/functional/test_arm_aspeed_ast2500.py
15
16
diff --git a/tests/functional/aspeed.py b/tests/functional/aspeed.py
17
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/functional/aspeed.py
19
+++ b/tests/functional/aspeed.py
20
@@ -XXX,XX +XXX,XX @@
21
#
22
# SPDX-License-Identifier: GPL-2.0-or-later
23
24
+from qemu_test import exec_command_and_wait_for_pattern
25
from qemu_test import LinuxKernelTest
26
27
class AspeedTest(LinuxKernelTest):
28
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed(self, machine, image):
29
"aspeed-smc 1e620000.spi: read control register: 203b0641")
30
self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
31
self.wait_for_console_pattern("systemd[1]: Set hostname to")
32
+
33
+ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
34
+ self.require_netdev('user')
35
+ self.vm.set_console()
36
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
37
+ '-net', 'nic', '-net', 'user')
38
+ self.vm.launch()
39
+
40
+ self.wait_for_console_pattern('U-Boot 2019.04')
41
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
42
+ self.wait_for_console_pattern('Starting kernel ...')
43
+ self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
44
+ self.wait_for_console_pattern('lease of 10.0.2.15')
45
+ # the line before login:
46
+ self.wait_for_console_pattern(pattern)
47
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
48
+ exec_command_and_wait_for_pattern(self, 'passw0rd', '#')
49
+
50
+ def do_test_arm_aspeed_buildroot_poweroff(self):
51
+ exec_command_and_wait_for_pattern(self, 'poweroff',
52
+ 'reboot: System halted');
53
+
54
+ def do_test_arm_aspeed_sdk_start(self, image):
55
+ self.require_netdev('user')
56
+ self.vm.set_console()
57
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
58
+ '-net', 'nic', '-net', 'user', '-snapshot')
59
+ self.vm.launch()
60
+
61
+ self.wait_for_console_pattern('U-Boot 2019.04')
62
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
63
+ self.wait_for_console_pattern('Starting kernel ...')
64
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
65
index XXXXXXX..XXXXXXX 100644
66
--- a/tests/functional/meson.build
67
+++ b/tests/functional/meson.build
68
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
69
'acpi_bits' : 420,
70
'arm_aspeed_palmetto' : 120,
71
'arm_aspeed_romulus' : 120,
72
+ 'arm_aspeed_ast2500' : 480,
73
'arm_aspeed' : 600,
74
'arm_bpim2u' : 500,
75
'arm_collie' : 180,
76
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
77
'arm_aspeed_ast1030',
78
'arm_aspeed_palmetto',
79
'arm_aspeed_romulus',
80
+ 'arm_aspeed_ast2500',
81
'arm_bpim2u',
82
'arm_canona1100',
83
'arm_collie',
84
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
85
index XXXXXXX..XXXXXXX 100755
86
--- a/tests/functional/test_arm_aspeed.py
87
+++ b/tests/functional/test_arm_aspeed.py
88
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'
89
def do_test_arm_aspeed_buildroot_poweroff(self):
90
exec_command_and_wait_for_pattern(self, 'poweroff',
91
'reboot: System halted');
92
-
93
- ASSET_BR2_202311_AST2500_FLASH = Asset(
94
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
95
- 'images/ast2500-evb/buildroot-2023.11/flash.img'),
96
- 'c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
97
-
98
- def test_arm_ast2500_evb_buildroot(self):
99
- self.set_machine('ast2500-evb')
100
-
101
- image_path = self.ASSET_BR2_202311_AST2500_FLASH.fetch()
102
-
103
- self.vm.add_args('-device',
104
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
105
- self.do_test_arm_aspeed_buildroot_start(image_path, '0x0',
106
- 'ast2500-evb login:')
107
-
108
- exec_command_and_wait_for_pattern(self,
109
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
110
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
111
- exec_command_and_wait_for_pattern(self,
112
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
113
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
114
- property='temperature', value=18000);
115
- exec_command_and_wait_for_pattern(self,
116
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
117
-
118
- self.do_test_arm_aspeed_buildroot_poweroff()
119
-
120
ASSET_BR2_202311_AST2600_FLASH = Asset(
121
('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
122
'images/ast2600-evb/buildroot-2023.11/flash.img'),
123
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_sdk_start(self, image):
124
self.wait_for_console_pattern('## Loading kernel from FIT Image')
125
self.wait_for_console_pattern('Starting kernel ...')
126
127
- ASSET_SDK_V806_AST2500 = Asset(
128
- 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2500-default-obmc.tar.gz',
129
- 'e1755f3cadff69190438c688d52dd0f0d399b70a1e14b1d3d5540fc4851d38ca')
130
-
131
- def test_arm_ast2500_evb_sdk(self):
132
- self.set_machine('ast2500-evb')
133
-
134
- image_path = self.ASSET_SDK_V806_AST2500.fetch()
135
-
136
- archive_extract(image_path, self.workdir)
137
-
138
- self.do_test_arm_aspeed_sdk_start(
139
- self.workdir + '/ast2500-default/image-bmc')
140
-
141
- self.wait_for_console_pattern('ast2500-default login:')
142
-
143
ASSET_SDK_V806_AST2600_A2 = Asset(
144
'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
145
'9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
146
diff --git a/tests/functional/test_arm_aspeed_ast2500.py b/tests/functional/test_arm_aspeed_ast2500.py
147
new file mode 100644
148
index XXXXXXX..XXXXXXX
149
--- /dev/null
150
+++ b/tests/functional/test_arm_aspeed_ast2500.py
151
@@ -XXX,XX +XXX,XX @@
152
+#!/usr/bin/env python3
153
+#
154
+# Functional test that boots the ASPEED machines
155
+#
156
+# SPDX-License-Identifier: GPL-2.0-or-later
157
+
158
+from qemu_test import Asset
159
+from aspeed import AspeedTest
160
+from qemu_test import exec_command_and_wait_for_pattern
161
+from qemu_test.utils import archive_extract
162
+
163
+class AST2500Machine(AspeedTest):
164
+
165
+ ASSET_BR2_202311_AST2500_FLASH = Asset(
166
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
167
+ 'images/ast2500-evb/buildroot-2023.11/flash.img'),
168
+ 'c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
169
+
170
+ def test_arm_ast2500_evb_buildroot(self):
171
+ self.set_machine('ast2500-evb')
172
+
173
+ image_path = self.ASSET_BR2_202311_AST2500_FLASH.fetch()
174
+
175
+ self.vm.add_args('-device',
176
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
177
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0x0',
178
+ 'ast2500-evb login:')
179
+
180
+ exec_command_and_wait_for_pattern(self,
181
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
182
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
183
+ exec_command_and_wait_for_pattern(self,
184
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
185
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
186
+ property='temperature', value=18000);
187
+ exec_command_and_wait_for_pattern(self,
188
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
189
+
190
+ self.do_test_arm_aspeed_buildroot_poweroff()
191
+
192
+ ASSET_SDK_V806_AST2500 = Asset(
193
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2500-default-obmc.tar.gz',
194
+ 'e1755f3cadff69190438c688d52dd0f0d399b70a1e14b1d3d5540fc4851d38ca')
195
+
196
+ def test_arm_ast2500_evb_sdk(self):
197
+ self.set_machine('ast2500-evb')
198
+
199
+ image_path = self.ASSET_SDK_V806_AST2500.fetch()
200
+
201
+ archive_extract(image_path, self.workdir)
202
+
203
+ self.do_test_arm_aspeed_sdk_start(
204
+ self.workdir + '/ast2500-default/image-bmc')
205
+
206
+ self.wait_for_console_pattern('ast2500-default login:')
207
+
208
+
209
+if __name__ == '__main__':
210
+ AspeedTest.main()
211
--
212
2.47.1
213
214
diff view generated by jsdifflib
1
This is a simple conversion of the tests with some cleanups and
1
This moves the ast2600-evb tests to a new test file. No changes in the
2
adjustments to match the new test framework. Replace the zephyr image
2
test. The routines used to run the buildroot and sdk tests are removed
3
MD5 hashes with SHA256 hashes while at it.
3
from the test_arm_aspeed.py file because now unused.
4
4
5
The SDK tests depend on a ssh class from avocado.utils which is
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
difficult to replace. To be addressed separately.
6
Link: https://lore.kernel.org/r/20241206131132.520911-6-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
8
---
9
tests/functional/meson.build | 2 +
10
tests/functional/test_arm_aspeed.py | 155 --------------------
11
tests/functional/test_arm_aspeed_ast2600.py | 143 ++++++++++++++++++
12
3 files changed, 145 insertions(+), 155 deletions(-)
13
create mode 100644 tests/functional/test_arm_aspeed_ast2600.py
7
14
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
9
Reviewed-by: Thomas Huth <thuth@redhat.com>
10
Tested-by: Thomas Huth <thuth@redhat.com>
11
---
12
tests/avocado/machine_aspeed.py | 292 ----------------------------
13
tests/functional/meson.build | 2 +
14
tests/functional/test_arm_aspeed.py | 282 +++++++++++++++++++++++++++
15
3 files changed, 284 insertions(+), 292 deletions(-)
16
create mode 100644 tests/functional/test_arm_aspeed.py
17
18
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/tests/avocado/machine_aspeed.py
17
--- a/tests/functional/meson.build
21
+++ b/tests/avocado/machine_aspeed.py
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
22
@@ -XXX,XX +XXX,XX @@
39
@@ -XXX,XX +XXX,XX @@
23
from avocado_qemu import has_cmd
40
from zipfile import ZipFile
24
from avocado.utils import archive
41
from unittest import skipUnless
25
from avocado import skipUnless
42
26
-from avocado import skipUnless
43
-class AST2x00Machine(LinuxKernelTest):
27
-
28
-
29
-class AST1030Machine(QemuSystemTest):
30
- """Boots the zephyr os and checks that the console is operational"""
31
-
32
- timeout = 10
33
-
34
- def test_ast1030_zephyros_1_04(self):
35
- """
36
- :avocado: tags=arch:arm
37
- :avocado: tags=machine:ast1030-evb
38
- :avocado: tags=os:zephyr
39
- """
40
- tar_url = ('https://github.com/AspeedTech-BMC'
41
- '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip')
42
- tar_hash = '4c6a8ce3a8ba76ef1a65dae419ae3409343c4b20'
43
- tar_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
44
- archive.extract(tar_path, self.workdir)
45
- kernel_file = self.workdir + "/ast1030-evb-demo/zephyr.elf"
46
- self.vm.set_console()
47
- self.vm.add_args('-kernel', kernel_file,
48
- '-nographic')
49
- self.vm.launch()
50
- wait_for_console_pattern(self, "Booting Zephyr OS")
51
- exec_command_and_wait_for_pattern(self, "help",
52
- "Available commands")
53
-
54
- def test_ast1030_zephyros_1_07(self):
55
- """
56
- :avocado: tags=arch:arm
57
- :avocado: tags=machine:ast1030-evb
58
- :avocado: tags=os:zephyr
59
- """
60
- tar_url = ('https://github.com/AspeedTech-BMC'
61
- '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip')
62
- tar_hash = '40ac87eabdcd3b3454ce5aad11fedc72a33ecda2'
63
- tar_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
64
- archive.extract(tar_path, self.workdir)
65
- kernel_file = self.workdir + "/ast1030-evb-demo/zephyr.bin"
66
- self.vm.set_console()
67
- self.vm.add_args('-kernel', kernel_file,
68
- '-nographic')
69
- self.vm.launch()
70
- wait_for_console_pattern(self, "Booting Zephyr OS")
71
- for shell_cmd in [
72
- 'kernel stacks',
73
- 'otp info conf',
74
- 'otp info scu',
75
- 'hwinfo devid',
76
- 'crypto aes256_cbc_vault',
77
- 'random get',
78
- 'jtag JTAG1 sw_xfer high TMS',
79
- 'adc ADC0 resolution 12',
80
- 'adc ADC0 read 42',
81
- 'adc ADC1 read 69',
82
- 'i2c scan I2C_0',
83
- 'i3c attach I3C_0',
84
- 'hash test',
85
- 'kernel uptime',
86
- 'kernel reboot warm',
87
- 'kernel uptime',
88
- 'kernel reboot cold',
89
- 'kernel uptime',
90
- ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
91
-
92
-class AST2x00Machine(QemuSystemTest):
93
-
94
- timeout = 180
95
-
96
- def wait_for_console_pattern(self, success_message, vm=None):
97
- wait_for_console_pattern(self, success_message,
98
- failure_message='Kernel panic - not syncing',
99
- vm=vm)
100
-
101
- def do_test_arm_aspeed(self, image):
102
- self.vm.set_console()
103
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
104
- '-net', 'nic')
105
- self.vm.launch()
106
-
107
- self.wait_for_console_pattern("U-Boot 2016.07")
108
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
109
- self.wait_for_console_pattern("Starting kernel ...")
110
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
111
- wait_for_console_pattern(self,
112
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
113
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
114
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
115
-
116
- def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
117
- """
118
- :avocado: tags=arch:arm
119
- :avocado: tags=machine:palmetto-bmc
120
- """
121
-
122
- image_url = ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
123
- 'obmc-phosphor-image-palmetto.static.mtd')
124
- image_hash = ('3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d')
125
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
126
- algorithm='sha256')
127
-
128
- self.do_test_arm_aspeed(image_path)
129
-
130
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
131
- """
132
- :avocado: tags=arch:arm
133
- :avocado: tags=machine:romulus-bmc
134
- """
135
-
136
- image_url = ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
137
- 'obmc-phosphor-image-romulus.static.mtd')
138
- image_hash = ('820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
139
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
140
- algorithm='sha256')
141
-
142
- self.do_test_arm_aspeed(image_path)
143
-
44
-
144
- def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
45
- def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
145
- self.require_netdev('user')
46
- self.require_netdev('user')
146
-
147
- self.vm.set_console()
47
- self.vm.set_console()
148
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
48
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
149
- '-net', 'nic', '-net', 'user')
49
- '-net', 'nic', '-net', 'user')
150
- self.vm.launch()
50
- self.vm.launch()
151
-
51
-
152
- self.wait_for_console_pattern('U-Boot 2019.04')
52
- self.wait_for_console_pattern('U-Boot 2019.04')
153
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
53
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
154
- self.wait_for_console_pattern('Starting kernel ...')
54
- self.wait_for_console_pattern('Starting kernel ...')
155
- self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
55
- self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
156
- self.wait_for_console_pattern('lease of 10.0.2.15')
56
- self.wait_for_console_pattern('lease of 10.0.2.15')
157
- # the line before login:
57
- # the line before login:
158
- self.wait_for_console_pattern(pattern)
58
- self.wait_for_console_pattern(pattern)
159
- time.sleep(0.1)
59
- exec_command_and_wait_for_pattern(self, 'root', 'Password:')
160
- exec_command(self, 'root')
60
- exec_command_and_wait_for_pattern(self, 'passw0rd', '#')
161
- time.sleep(0.1)
162
- exec_command(self, "passw0rd")
163
-
61
-
164
- def do_test_arm_aspeed_buildroot_poweroff(self):
62
- def do_test_arm_aspeed_buildroot_poweroff(self):
165
- exec_command_and_wait_for_pattern(self, 'poweroff',
63
- exec_command_and_wait_for_pattern(self, 'poweroff',
166
- 'reboot: System halted');
64
- 'reboot: System halted');
167
-
65
- ASSET_BR2_202311_AST2600_FLASH = Asset(
168
- def test_arm_ast2500_evb_buildroot(self):
66
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
169
- """
67
- 'images/ast2600-evb/buildroot-2023.11/flash.img'),
170
- :avocado: tags=arch:arm
68
- 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
171
- :avocado: tags=machine:ast2500-evb
69
-
172
- """
70
- def test_arm_ast2600_evb_buildroot(self):
173
-
71
- self.set_machine('ast2600-evb')
174
- image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
72
-
175
- 'images/ast2500-evb/buildroot-2023.11/flash.img')
73
- image_path = self.ASSET_BR2_202311_AST2600_FLASH.fetch()
176
- image_hash = ('c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
177
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
178
- algorithm='sha256')
179
-
74
-
180
- self.vm.add_args('-device',
75
- self.vm.add_args('-device',
181
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
76
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
182
- self.do_test_arm_aspeed_buildroot_start(image_path, '0x0', 'Aspeed AST2500 EVB')
183
-
184
- exec_command_and_wait_for_pattern(self,
185
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
186
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
187
- exec_command_and_wait_for_pattern(self,
188
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
189
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
190
- property='temperature', value=18000);
191
- exec_command_and_wait_for_pattern(self,
192
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
193
-
194
- self.do_test_arm_aspeed_buildroot_poweroff()
195
-
196
- def test_arm_ast2600_evb_buildroot(self):
197
- """
198
- :avocado: tags=arch:arm
199
- :avocado: tags=machine:ast2600-evb
200
- """
201
-
202
- image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
203
- 'images/ast2600-evb/buildroot-2023.11/flash.img')
204
- image_hash = ('b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
205
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
206
- algorithm='sha256')
207
-
208
- self.vm.add_args('-device',
209
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
210
- self.vm.add_args('-device',
77
- self.vm.add_args('-device',
211
- 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
78
- 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
212
- self.vm.add_args('-device',
79
- self.vm.add_args('-device',
213
- 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
80
- 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
214
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
81
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00',
82
- 'ast2600-evb login:')
215
-
83
-
216
- exec_command_and_wait_for_pattern(self,
84
- exec_command_and_wait_for_pattern(self,
217
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
85
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
218
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
86
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
219
- exec_command_and_wait_for_pattern(self,
87
- exec_command_and_wait_for_pattern(self,
...
...
230
- exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
98
- exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
231
-
99
-
232
- exec_command_and_wait_for_pattern(self,
100
- exec_command_and_wait_for_pattern(self,
233
- 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
101
- 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
234
- 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
102
- 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
235
- exec_command(self, 'i2cset -y 3 0x42 0x64 0x00 0xaa i');
103
- exec_command_and_wait_for_pattern(self,
236
- time.sleep(0.1)
104
- 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
237
- exec_command_and_wait_for_pattern(self,
105
- exec_command_and_wait_for_pattern(self,
238
- 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
106
- 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
239
- '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
107
- '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
240
- self.do_test_arm_aspeed_buildroot_poweroff()
108
- self.do_test_arm_aspeed_buildroot_poweroff()
241
-
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
-
242
- @skipUnless(*has_cmd('swtpm'))
115
- @skipUnless(*has_cmd('swtpm'))
243
- def test_arm_ast2600_evb_buildroot_tpm(self):
116
- def test_arm_ast2600_evb_buildroot_tpm(self):
244
- """
117
- self.set_machine('ast2600-evb')
245
- :avocado: tags=arch:arm
118
-
246
- :avocado: tags=machine:ast2600-evb
119
- image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
247
- """
120
-
248
-
121
- tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
249
- image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
122
- socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
250
- 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img')
123
-
251
- image_hash = ('a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
124
- # We must put the TPM state dir in /tmp/, not the build dir,
252
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
125
- # because some distros use AppArmor to lock down swtpm and
253
- algorithm='sha256')
126
- # restrict the set of locations it can access files in.
254
-
255
- # force creation of VM object, which also defines self._sd
256
- vm = self.vm
257
-
258
- socket = os.path.join(self._sd.name, 'swtpm-socket')
259
-
260
- subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
127
- subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
261
- '--tpmstate', f'dir={self.vm.temp_dir}',
128
- '--tpmstate', f'dir={tpmstate_dir.name}',
262
- '--ctrl', f'type=unixio,path={socket}'])
129
- '--ctrl', f'type=unixio,path={socket}'])
263
-
130
-
264
- self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
131
- self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
265
- self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
132
- self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
266
- self.vm.add_args('-device',
133
- self.vm.add_args('-device',
...
...
273
- exec_command_and_wait_for_pattern(self,
140
- exec_command_and_wait_for_pattern(self,
274
- 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
141
- 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
275
- 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
142
- 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
276
-
143
-
277
- self.do_test_arm_aspeed_buildroot_poweroff()
144
- self.do_test_arm_aspeed_buildroot_poweroff()
278
145
-
279
class AST2x00MachineSDK(QemuSystemTest, LinuxSSHMixIn):
146
- def do_test_arm_aspeed_sdk_start(self, image):
280
281
@@ -XXX,XX +XXX,XX @@ def test_aarch64_ast2700_evb_sdk_v09_02(self):
282
property='temperature', value=18000)
283
self.ssh_command_output_contains(
284
'cat /sys/class/hwmon/hwmon20/temp1_input', '18000')
285
-
286
-class AST2x00MachineMMC(QemuSystemTest):
287
-
288
- timeout = 240
289
-
290
- def wait_for_console_pattern(self, success_message, vm=None):
291
- wait_for_console_pattern(self, success_message,
292
- failure_message='Kernel panic - not syncing',
293
- vm=vm)
294
-
295
- def test_arm_aspeed_emmc_boot(self):
296
- """
297
- :avocado: tags=arch:arm
298
- :avocado: tags=machine:rainier-bmc
299
- :avocado: tags=device:emmc
300
- """
301
-
302
- image_url = ('https://fileserver.linaro.org/s/B6pJTwWEkzSDi36/download/'
303
- 'mmc-p10bmc-20240617.qcow2')
304
- image_hash = ('d523fb478d2b84d5adc5658d08502bc64b1486955683814f89c6137518acd90b')
305
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
306
- algorithm='sha256')
307
-
308
- self.require_netdev('user')
147
- self.require_netdev('user')
309
-
310
- self.vm.set_console()
148
- self.vm.set_console()
311
- self.vm.add_args('-drive',
149
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
312
- 'file=' + image_path + ',if=sd,id=sd2,index=2',
150
- '-net', 'nic', '-net', 'user', '-snapshot')
313
- '-net', 'nic', '-net', 'user')
314
- self.vm.launch()
151
- self.vm.launch()
315
-
152
-
316
- self.wait_for_console_pattern('U-Boot SPL 2019.04')
317
- self.wait_for_console_pattern('Trying to boot from MMC1')
318
- self.wait_for_console_pattern('U-Boot 2019.04')
153
- self.wait_for_console_pattern('U-Boot 2019.04')
319
- self.wait_for_console_pattern('eMMC 2nd Boot')
320
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
154
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
321
- self.wait_for_console_pattern('Starting kernel ...')
155
- self.wait_for_console_pattern('Starting kernel ...')
322
- self.wait_for_console_pattern('Booting Linux on physical CPU 0xf00')
156
-
323
- self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
157
- ASSET_SDK_V806_AST2600_A2 = Asset(
324
- self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
158
- 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
325
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
159
- '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
326
index XXXXXXX..XXXXXXX 100644
160
-
327
--- a/tests/functional/meson.build
161
- def test_arm_ast2600_evb_sdk(self):
328
+++ b/tests/functional/meson.build
162
- self.set_machine('ast2600-evb')
329
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
163
-
330
'aarch64_sbsaref' : 600,
164
- image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
331
'aarch64_virt' : 360,
165
-
332
'acpi_bits' : 240,
166
- archive_extract(image_path, self.workdir)
333
+ 'arm_aspeed' : 600,
167
-
334
'arm_raspi2' : 120,
168
- self.vm.add_args('-device',
335
'arm_tuxrun' : 120,
169
- 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
336
'mips_malta' : 120,
170
- self.vm.add_args('-device',
337
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
171
- 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
338
]
172
- self.do_test_arm_aspeed_sdk_start(
339
173
- self.workdir + '/ast2600-a2/image-bmc')
340
tests_arm_system_thorough = [
174
-
341
+ 'arm_aspeed',
175
- self.wait_for_console_pattern('ast2600-a2 login:')
342
'arm_canona1100',
176
-
343
'arm_integratorcp',
177
- exec_command_and_wait_for_pattern(self, 'root', 'Password:')
344
'arm_raspi2',
178
- exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
345
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
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
346
new file mode 100644
202
new file mode 100644
347
index XXXXXXX..XXXXXXX
203
index XXXXXXX..XXXXXXX
348
--- /dev/null
204
--- /dev/null
349
+++ b/tests/functional/test_arm_aspeed.py
205
+++ b/tests/functional/test_arm_aspeed_ast2600.py
350
@@ -XXX,XX +XXX,XX @@
206
@@ -XXX,XX +XXX,XX @@
351
+#!/usr/bin/env python3
207
+#!/usr/bin/env python3
352
+#
208
+#
353
+# Functional test that boots the ASPEED SoCs with firmware
209
+# Functional test that boots the ASPEED machines
354
+#
355
+# Copyright (C) 2022 ASPEED Technology Inc
356
+#
210
+#
357
+# SPDX-License-Identifier: GPL-2.0-or-later
211
+# SPDX-License-Identifier: GPL-2.0-or-later
358
+
212
+
359
+import os
213
+import os
360
+import time
214
+import time
215
+import tempfile
361
+import subprocess
216
+import subprocess
362
+import tempfile
217
+
363
+
218
+from qemu_test import Asset
364
+from qemu_test import LinuxKernelTest, Asset
219
+from aspeed import AspeedTest
365
+from qemu_test import exec_command_and_wait_for_pattern
220
+from qemu_test import exec_command_and_wait_for_pattern
366
+from qemu_test import interrupt_interactive_console_until_pattern
367
+from qemu_test import exec_command
368
+from qemu_test import has_cmd
221
+from qemu_test import has_cmd
369
+from qemu_test.utils import archive_extract
222
+from qemu_test.utils import archive_extract
370
+from zipfile import ZipFile
371
+from unittest import skipUnless
223
+from unittest import skipUnless
372
+
224
+
373
+class AST1030Machine(LinuxKernelTest):
225
+class AST2600Machine(AspeedTest):
374
+
375
+ ASSET_ZEPHYR_1_04 = Asset(
376
+ ('https://github.com/AspeedTech-BMC'
377
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
378
+ '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
379
+
380
+ def test_ast1030_zephyros_1_04(self):
381
+ self.set_machine('ast1030-evb')
382
+
383
+ zip_file = self.ASSET_ZEPHYR_1_04.fetch()
384
+
385
+ kernel_name = "ast1030-evb-demo/zephyr.elf"
386
+ with ZipFile(zip_file, 'r') as zf:
387
+ zf.extract(kernel_name, path=self.workdir)
388
+ kernel_file = os.path.join(self.workdir, kernel_name)
389
+
390
+ self.vm.set_console()
391
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
392
+ self.vm.launch()
393
+ self.wait_for_console_pattern("Booting Zephyr OS")
394
+ exec_command_and_wait_for_pattern(self, "help",
395
+ "Available commands")
396
+
397
+ ASSET_ZEPHYR_1_07 = Asset(
398
+ ('https://github.com/AspeedTech-BMC'
399
+ '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
400
+ 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
401
+
402
+ def test_ast1030_zephyros_1_07(self):
403
+ self.set_machine('ast1030-evb')
404
+
405
+ zip_file = self.ASSET_ZEPHYR_1_07.fetch()
406
+
407
+ kernel_name = "ast1030-evb-demo/zephyr.bin"
408
+ with ZipFile(zip_file, 'r') as zf:
409
+ zf.extract(kernel_name, path=self.workdir)
410
+ kernel_file = os.path.join(self.workdir, kernel_name)
411
+
412
+ self.vm.set_console()
413
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
414
+ self.vm.launch()
415
+ self.wait_for_console_pattern("Booting Zephyr OS")
416
+ for shell_cmd in [
417
+ 'kernel stacks',
418
+ 'otp info conf',
419
+ 'otp info scu',
420
+ 'hwinfo devid',
421
+ 'crypto aes256_cbc_vault',
422
+ 'random get',
423
+ 'jtag JTAG1 sw_xfer high TMS',
424
+ 'adc ADC0 resolution 12',
425
+ 'adc ADC0 read 42',
426
+ 'adc ADC1 read 69',
427
+ 'i2c scan I2C_0',
428
+ 'i3c attach I3C_0',
429
+ 'hash test',
430
+ 'kernel uptime',
431
+ 'kernel reboot warm',
432
+ 'kernel uptime',
433
+ 'kernel reboot cold',
434
+ 'kernel uptime',
435
+ ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
436
+
437
+class AST2x00Machine(LinuxKernelTest):
438
+
439
+ def do_test_arm_aspeed(self, machine, image):
440
+ self.set_machine(machine)
441
+ self.vm.set_console()
442
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
443
+ '-net', 'nic', '-snapshot')
444
+ self.vm.launch()
445
+
446
+ self.wait_for_console_pattern("U-Boot 2016.07")
447
+ self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
448
+ self.wait_for_console_pattern("Starting kernel ...")
449
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
450
+ self.wait_for_console_pattern(
451
+ "aspeed-smc 1e620000.spi: read control register: 203b0641")
452
+ self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
453
+ self.wait_for_console_pattern("systemd[1]: Set hostname to")
454
+
455
+ ASSET_PALMETTO_FLASH = Asset(
456
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
457
+ 'obmc-phosphor-image-palmetto.static.mtd'),
458
+ '3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d');
459
+
460
+ def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
461
+ image_path = self.ASSET_PALMETTO_FLASH.fetch()
462
+
463
+ self.do_test_arm_aspeed('palmetto-bmc', image_path)
464
+
465
+ ASSET_ROMULUS_FLASH = Asset(
466
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
467
+ 'obmc-phosphor-image-romulus.static.mtd'),
468
+ '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
469
+
470
+ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
471
+ image_path = self.ASSET_ROMULUS_FLASH.fetch()
472
+
473
+ self.do_test_arm_aspeed('romulus-bmc', image_path)
474
+
475
+ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
476
+ self.require_netdev('user')
477
+ self.vm.set_console()
478
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
479
+ '-net', 'nic', '-net', 'user')
480
+ self.vm.launch()
481
+
482
+ self.wait_for_console_pattern('U-Boot 2019.04')
483
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
484
+ self.wait_for_console_pattern('Starting kernel ...')
485
+ self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
486
+ self.wait_for_console_pattern('lease of 10.0.2.15')
487
+ # the line before login:
488
+ self.wait_for_console_pattern(pattern)
489
+ time.sleep(0.1)
490
+ exec_command(self, 'root')
491
+ time.sleep(0.1)
492
+ exec_command(self, "passw0rd")
493
+
494
+ def do_test_arm_aspeed_buildroot_poweroff(self):
495
+ exec_command_and_wait_for_pattern(self, 'poweroff',
496
+ 'reboot: System halted');
497
+
498
+ ASSET_BR2_202311_AST2500_FLASH = Asset(
499
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
500
+ 'images/ast2500-evb/buildroot-2023.11/flash.img'),
501
+ 'c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
502
+
503
+ def test_arm_ast2500_evb_buildroot(self):
504
+ self.set_machine('ast2500-evb')
505
+
506
+ image_path = self.ASSET_BR2_202311_AST2500_FLASH.fetch()
507
+
508
+ self.vm.add_args('-device',
509
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
510
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0x0',
511
+ 'Aspeed AST2500 EVB')
512
+
513
+ exec_command_and_wait_for_pattern(self,
514
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
515
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
516
+ exec_command_and_wait_for_pattern(self,
517
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
518
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
519
+ property='temperature', value=18000);
520
+ exec_command_and_wait_for_pattern(self,
521
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
522
+
523
+ self.do_test_arm_aspeed_buildroot_poweroff()
524
+
226
+
525
+ ASSET_BR2_202311_AST2600_FLASH = Asset(
227
+ ASSET_BR2_202311_AST2600_FLASH = Asset(
526
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
228
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
527
+ 'images/ast2600-evb/buildroot-2023.11/flash.img'),
229
+ 'images/ast2600-evb/buildroot-2023.11/flash.img'),
528
+ 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
230
+ 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
...
...
536
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
238
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
537
+ self.vm.add_args('-device',
239
+ self.vm.add_args('-device',
538
+ 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
240
+ 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
539
+ self.vm.add_args('-device',
241
+ self.vm.add_args('-device',
540
+ 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
242
+ 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
541
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
243
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00',
244
+ 'ast2600-evb login:')
542
+
245
+
543
+ exec_command_and_wait_for_pattern(self,
246
+ exec_command_and_wait_for_pattern(self,
544
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
247
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
545
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
248
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
546
+ exec_command_and_wait_for_pattern(self,
249
+ exec_command_and_wait_for_pattern(self,
...
...
557
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
260
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
558
+
261
+
559
+ exec_command_and_wait_for_pattern(self,
262
+ exec_command_and_wait_for_pattern(self,
560
+ 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
263
+ 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
561
+ 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
264
+ 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
562
+ exec_command(self, 'i2cset -y 3 0x42 0x64 0x00 0xaa i');
265
+ exec_command_and_wait_for_pattern(self,
563
+ time.sleep(0.1)
266
+ 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
564
+ exec_command_and_wait_for_pattern(self,
267
+ exec_command_and_wait_for_pattern(self,
565
+ 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
268
+ 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
566
+ '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
269
+ '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
567
+ self.do_test_arm_aspeed_buildroot_poweroff()
270
+ self.do_test_arm_aspeed_buildroot_poweroff()
568
+
271
+
...
...
575
+ def test_arm_ast2600_evb_buildroot_tpm(self):
278
+ def test_arm_ast2600_evb_buildroot_tpm(self):
576
+ self.set_machine('ast2600-evb')
279
+ self.set_machine('ast2600-evb')
577
+
280
+
578
+ image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
281
+ image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
579
+
282
+
580
+ socket_dir = tempfile.TemporaryDirectory(prefix="qemu_")
283
+ tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
581
+ socket = os.path.join(socket_dir.name, 'swtpm-socket')
284
+ socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
582
+
285
+
286
+ # We must put the TPM state dir in /tmp/, not the build dir,
287
+ # because some distros use AppArmor to lock down swtpm and
288
+ # restrict the set of locations it can access files in.
583
+ subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
289
+ subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
584
+ '--tpmstate', f'dir={self.vm.temp_dir}',
290
+ '--tpmstate', f'dir={tpmstate_dir.name}',
585
+ '--ctrl', f'type=unixio,path={socket}'])
291
+ '--ctrl', f'type=unixio,path={socket}'])
586
+
292
+
587
+ self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
293
+ self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
588
+ self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
294
+ self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
589
+ self.vm.add_args('-device',
295
+ self.vm.add_args('-device',
...
...
597
+ 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
303
+ 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
598
+ 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
304
+ 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
599
+
305
+
600
+ self.do_test_arm_aspeed_buildroot_poweroff()
306
+ self.do_test_arm_aspeed_buildroot_poweroff()
601
+
307
+
602
+class AST2x00MachineMMC(LinuxKernelTest):
308
+ ASSET_SDK_V806_AST2600_A2 = Asset(
603
+
309
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
604
+ ASSET_RAINIER_EMMC = Asset(
310
+ '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
605
+ ('https://fileserver.linaro.org/s/B6pJTwWEkzSDi36/download/'
311
+
606
+ 'mmc-p10bmc-20240617.qcow2'),
312
+ def test_arm_ast2600_evb_sdk(self):
607
+ 'd523fb478d2b84d5adc5658d08502bc64b1486955683814f89c6137518acd90b')
313
+ self.set_machine('ast2600-evb')
608
+
314
+
609
+ def test_arm_aspeed_emmc_boot(self):
315
+ image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
610
+ self.set_machine('rainier-bmc')
316
+
611
+ self.require_netdev('user')
317
+ archive_extract(image_path, self.workdir)
612
+
318
+
613
+ image_path = self.ASSET_RAINIER_EMMC.fetch()
319
+ self.vm.add_args('-device',
614
+
320
+ 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
615
+ self.vm.set_console()
321
+ self.vm.add_args('-device',
616
+ self.vm.add_args('-drive',
322
+ 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
617
+ 'file=' + image_path + ',if=sd,id=sd2,index=2',
323
+ self.do_test_arm_aspeed_sdk_start(
618
+ '-net', 'nic', '-net', 'user', '-snapshot')
324
+ self.workdir + '/ast2600-a2/image-bmc')
619
+ self.vm.launch()
325
+
620
+
326
+ self.wait_for_console_pattern('ast2600-a2 login:')
621
+ self.wait_for_console_pattern('U-Boot SPL 2019.04')
327
+
622
+ self.wait_for_console_pattern('Trying to boot from MMC1')
328
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
623
+ self.wait_for_console_pattern('U-Boot 2019.04')
329
+ exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
624
+ self.wait_for_console_pattern('eMMC 2nd Boot')
330
+
625
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
331
+ exec_command_and_wait_for_pattern(self,
626
+ self.wait_for_console_pattern('Starting kernel ...')
332
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
627
+ self.wait_for_console_pattern('Booting Linux on physical CPU 0xf00')
333
+ 'i2c i2c-5: new_device: Instantiated device lm75 at 0x4d');
628
+ self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
334
+ exec_command_and_wait_for_pattern(self,
629
+ self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
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);
630
+
347
+
631
+if __name__ == '__main__':
348
+if __name__ == '__main__':
632
+ LinuxKernelTest.main()
349
+ AspeedTest.main()
633
--
350
--
634
2.47.0
351
2.47.1
635
352
636
353
diff view generated by jsdifflib
New patch
1
This simply moves the rainier-bmc test to a new test file. No changes
2
in the test. The test_arm_aspeed.py is deleted.
1
3
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
5
Link: https://lore.kernel.org/r/20241206131132.520911-7-clg@redhat.com
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
tests/functional/meson.build | 4 ++--
9
...m_aspeed.py => test_arm_aspeed_rainier.py} | 22 +++++--------------
10
2 files changed, 7 insertions(+), 19 deletions(-)
11
rename tests/functional/{test_arm_aspeed.py => test_arm_aspeed_rainier.py} (71%)
12
mode change 100755 => 100644
13
14
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
15
index XXXXXXX..XXXXXXX 100644
16
--- a/tests/functional/meson.build
17
+++ b/tests/functional/meson.build
18
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
19
'arm_aspeed_romulus' : 120,
20
'arm_aspeed_ast2500' : 480,
21
'arm_aspeed_ast2600' : 720,
22
- 'arm_aspeed' : 600,
23
+ 'arm_aspeed_rainier' : 240,
24
'arm_bpim2u' : 500,
25
'arm_collie' : 180,
26
'arm_orangepi' : 540,
27
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
28
]
29
30
tests_arm_system_thorough = [
31
- 'arm_aspeed',
32
'arm_aspeed_ast1030',
33
'arm_aspeed_palmetto',
34
'arm_aspeed_romulus',
35
'arm_aspeed_ast2500',
36
'arm_aspeed_ast2600',
37
+ 'arm_aspeed_rainier',
38
'arm_bpim2u',
39
'arm_canona1100',
40
'arm_collie',
41
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed_rainier.py
42
old mode 100755
43
new mode 100644
44
similarity index 71%
45
rename from tests/functional/test_arm_aspeed.py
46
rename to tests/functional/test_arm_aspeed_rainier.py
47
index XXXXXXX..XXXXXXX
48
--- a/tests/functional/test_arm_aspeed.py
49
+++ b/tests/functional/test_arm_aspeed_rainier.py
50
@@ -XXX,XX +XXX,XX @@
51
#!/usr/bin/env python3
52
#
53
-# Functional test that boots the ASPEED SoCs with firmware
54
-#
55
-# Copyright (C) 2022 ASPEED Technology Inc
56
+# Functional test that boots the ASPEED machines
57
#
58
# SPDX-License-Identifier: GPL-2.0-or-later
59
60
-import os
61
-import time
62
-import subprocess
63
-import tempfile
64
-
65
-from qemu_test import LinuxKernelTest, Asset
66
-from qemu_test import exec_command_and_wait_for_pattern
67
-from qemu_test import interrupt_interactive_console_until_pattern
68
-from qemu_test import has_cmd
69
-from qemu_test.utils import archive_extract
70
-from zipfile import ZipFile
71
-from unittest import skipUnless
72
+from qemu_test import Asset
73
+from aspeed import AspeedTest
74
75
-class AST2x00MachineMMC(LinuxKernelTest):
76
+class RainierMachine(AspeedTest):
77
78
ASSET_RAINIER_EMMC = Asset(
79
('https://fileserver.linaro.org/s/B6pJTwWEkzSDi36/download/'
80
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
81
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
82
83
if __name__ == '__main__':
84
- LinuxKernelTest.main()
85
+ AspeedTest.main()
86
--
87
2.47.1
88
89
diff view generated by jsdifflib
New patch
1
This simply moves the debian boot test from the avocado testsuite to
2
the new functional testsuite. No changes in the test.
1
3
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
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Fix coding style issues from checkpatch.pl
3
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.
4
7
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-2-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
12
---
8
include/hw/gpio/aspeed_gpio.h | 2 +-
13
tests/qtest/aspeed_smc-test.c | 16 ++++++++++++----
9
hw/gpio/aspeed_gpio.c | 6 +++---
14
1 file changed, 12 insertions(+), 4 deletions(-)
10
2 files changed, 4 insertions(+), 4 deletions(-)
11
15
12
diff --git a/include/hw/gpio/aspeed_gpio.h b/include/hw/gpio/aspeed_gpio.h
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
13
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
14
--- a/include/hw/gpio/aspeed_gpio.h
18
--- a/tests/qtest/aspeed_smc-test.c
15
+++ b/include/hw/gpio/aspeed_gpio.h
19
+++ b/tests/qtest/aspeed_smc-test.c
16
@@ -XXX,XX +XXX,XX @@ struct AspeedGPIOState {
20
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
17
qemu_irq irq;
21
flash_reset();
18
qemu_irq gpios[ASPEED_GPIO_MAX_NR_SETS][ASPEED_GPIOS_PER_SET];
19
20
-/* Parallel GPIO Registers */
21
+ /* Parallel GPIO Registers */
22
uint32_t debounce_regs[ASPEED_GPIO_NR_DEBOUNCE_REGS];
23
struct GPIOSets {
24
uint32_t data_value; /* Reflects pin values */
25
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
26
index XXXXXXX..XXXXXXX 100644
27
--- a/hw/gpio/aspeed_gpio.c
28
+++ b/hw/gpio/aspeed_gpio.c
29
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx,
30
value &= ~pin_mask;
31
}
32
33
- aspeed_gpio_update(s, &s->sets[set_idx], value, ~s->sets[set_idx].direction);
34
+ aspeed_gpio_update(s, &s->sets[set_idx], value,
35
+ ~s->sets[set_idx].direction);
36
}
22
}
37
23
38
/*
24
-int main(int argc, char **argv)
39
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_gpio_read(void *opaque, hwaddr offset, uint32_t size)
25
+static int test_palmetto_bmc(void)
40
static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
41
uint64_t data, uint32_t size)
42
{
26
{
27
g_autofree char *tmp_path = NULL;
28
int ret;
29
int fd;
30
31
- g_test_init(&argc, &argv, NULL);
43
-
32
-
44
AspeedGPIOState *s = ASPEED_GPIO(opaque);
33
fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
45
AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
34
g_assert(fd >= 0);
46
const GPIOSetProperties *props;
35
ret = ftruncate(fd, FLASH_SIZE);
47
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_set_pin(Object *obj, Visitor *v, const char *name,
36
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
48
aspeed_gpio_set_pin_level(s, set_idx, pin, level);
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;
49
}
55
}
50
51
-/****************** Setup functions ******************/
52
+/* Setup functions */
53
static const GPIOSetProperties ast2400_set_props[ASPEED_GPIO_MAX_NR_SETS] = {
54
[0] = {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} },
55
[1] = {0xffffffff, 0xffffffff, {"E", "F", "G", "H"} },
56
--
56
--
57
2.47.0
57
2.47.1
58
58
59
59
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
AST2700 integrates two set of Parallel GPIO Controller with maximum 212
3
Currently, these test cases are only used for testing fmc_cs0 for AST2400.
4
control pins, which are 27 groups. (H, exclude pin: H7 H6 H5 H4)
4
To test others BMC SOCs, introduces a new TestData structure.
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.
5
7
6
In the previous design of ASPEED SOCs, one register is used for setting
8
Introduce new helper functions to make the test case more readable.
7
one function for one set which are 32 pins and 4 groups.
8
ex: GPIO000 is used for setting data value for GPIO A, B, C and D in AST2600.
9
ex: GPIO004 is used for setting direction for GPIO A, B, C and D in AST2600.
10
9
11
However, the register set have a significant change since AST2700.
10
Set spi base address 0x1E620000, flash_base address 0x20000000
12
Each GPIO pin has their own individual control register.
11
and jedec id 0x20ba19 for fmc_cs0 with n25q256a flash for AST2400
13
In other words, users are able to set one GPIO pin’s direction,
12
SMC model testing.
14
interrupt enable, input mask and so on in the same one register.
15
13
16
Currently, aspeed_gpio_read and aspeed_gpio_write callback functions
14
To pass the TestData into the test case, replace qtest_add_func with
17
are not compatible AST2700.
15
qtest_add_data_func.
18
19
Introduce new aspeed_gpio_2700_read and aspeed_gpio_2700_write callback
20
functions and aspeed_gpio_2700_ops memory region operation for AST2700.
21
Introduce a new ast2700 class to support AST2700.
22
16
23
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
17
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
24
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
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>
25
---
21
---
26
hw/gpio/aspeed_gpio.c | 380 ++++++++++++++++++++++++++++++++++++++++++
22
tests/qtest/aspeed_smc-test.c | 546 +++++++++++++++++++---------------
27
1 file changed, 380 insertions(+)
23
1 file changed, 299 insertions(+), 247 deletions(-)
28
24
29
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
25
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
30
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
31
--- a/hw/gpio/aspeed_gpio.c
27
--- a/tests/qtest/aspeed_smc-test.c
32
+++ b/hw/gpio/aspeed_gpio.c
28
+++ b/tests/qtest/aspeed_smc-test.c
33
@@ -XXX,XX +XXX,XX @@ REG32(GPIO_INDEX_REG, 0x2AC)
29
@@ -XXX,XX +XXX,XX @@
34
FIELD(GPIO_INDEX_REG, COMMAND_SRC_1, 21, 1)
30
#define CTRL_USERMODE 0x3
35
FIELD(GPIO_INDEX_REG, INPUT_MASK, 20, 1)
31
#define SR_WEL BIT(1)
36
32
37
+/* AST2700 GPIO Register Address Offsets */
33
-#define ASPEED_FMC_BASE 0x1E620000
38
+REG32(GPIO_2700_DEBOUNCE_TIME_1, 0x000)
34
-#define ASPEED_FLASH_BASE 0x20000000
39
+REG32(GPIO_2700_DEBOUNCE_TIME_2, 0x004)
35
-
40
+REG32(GPIO_2700_DEBOUNCE_TIME_3, 0x008)
36
/*
41
+REG32(GPIO_2700_INT_STATUS_1, 0x100)
37
* Flash commands
42
+REG32(GPIO_2700_INT_STATUS_2, 0x104)
38
*/
43
+REG32(GPIO_2700_INT_STATUS_3, 0x108)
39
@@ -XXX,XX +XXX,XX @@ enum {
44
+REG32(GPIO_2700_INT_STATUS_4, 0x10C)
40
ERASE_SECTOR = 0xd8,
45
+REG32(GPIO_2700_INT_STATUS_5, 0x110)
41
};
46
+REG32(GPIO_2700_INT_STATUS_6, 0x114)
42
47
+REG32(GPIO_2700_INT_STATUS_7, 0x118)
43
-#define FLASH_JEDEC 0x20ba19 /* n25q256a */
48
+/* GPIOA0 - GPIOAA7 Control Register */
44
-#define FLASH_SIZE (32 * 1024 * 1024)
49
+REG32(GPIO_A0_CONTROL, 0x180)
45
-
50
+ SHARED_FIELD(GPIO_CONTROL_OUT_DATA, 0, 1)
46
#define FLASH_PAGE_SIZE 256
51
+ SHARED_FIELD(GPIO_CONTROL_DIRECTION, 1, 1)
47
52
+ SHARED_FIELD(GPIO_CONTROL_INT_ENABLE, 2, 1)
48
+typedef struct TestData {
53
+ SHARED_FIELD(GPIO_CONTROL_INT_SENS_0, 3, 1)
49
+ QTestState *s;
54
+ SHARED_FIELD(GPIO_CONTROL_INT_SENS_1, 4, 1)
50
+ uint64_t spi_base;
55
+ SHARED_FIELD(GPIO_CONTROL_INT_SENS_2, 5, 1)
51
+ uint64_t flash_base;
56
+ SHARED_FIELD(GPIO_CONTROL_RESET_TOLERANCE, 6, 1)
52
+ uint32_t jedec_id;
57
+ SHARED_FIELD(GPIO_CONTROL_DEBOUNCE_1, 7, 1)
53
+ char *tmp_path;
58
+ SHARED_FIELD(GPIO_CONTROL_DEBOUNCE_2, 8, 1)
54
+} TestData;
59
+ SHARED_FIELD(GPIO_CONTROL_INPUT_MASK, 9, 1)
60
+ SHARED_FIELD(GPIO_CONTROL_BLINK_COUNTER_1, 10, 1)
61
+ SHARED_FIELD(GPIO_CONTROL_BLINK_COUNTER_2, 11, 1)
62
+ SHARED_FIELD(GPIO_CONTROL_INT_STATUS, 12, 1)
63
+ SHARED_FIELD(GPIO_CONTROL_IN_DATA, 13, 1)
64
+ SHARED_FIELD(GPIO_CONTROL_RESERVED, 14, 18)
65
+REG32(GPIO_AA7_CONTROL, 0x4DC)
66
+#define GPIO_2700_MEM_SIZE 0x4E0
67
+#define GPIO_2700_REG_ARRAY_SIZE (GPIO_2700_MEM_SIZE >> 2)
68
+
55
+
69
static int aspeed_evaluate_irq(GPIOSets *regs, int gpio_prev_high, int gpio)
56
/*
70
{
57
* Use an explicit bswap for the values read/wrote to the flash region
71
uint32_t falling_edge = 0, rising_edge = 0;
58
* as they are BE and the Aspeed CPU is LE.
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_set_pin(Object *obj, Visitor *v, const char *name,
59
@@ -XXX,XX +XXX,XX @@ static inline uint32_t make_be32(uint32_t data)
73
aspeed_gpio_set_pin_level(s, set_idx, pin, level);
60
return bswap32(data);
74
}
61
}
75
62
76
+static uint64_t aspeed_gpio_2700_read_control_reg(AspeedGPIOState *s,
63
-static void spi_conf(uint32_t value)
77
+ uint32_t pin)
64
+static inline void spi_writel(const TestData *data, uint64_t offset,
65
+ uint32_t value)
78
+{
66
+{
79
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
67
+ qtest_writel(data->s, data->spi_base + offset, value);
80
+ GPIOSets *set;
81
+ uint64_t value = 0;
82
+ uint32_t set_idx;
83
+ uint32_t pin_idx;
84
+
85
+ set_idx = pin / ASPEED_GPIOS_PER_SET;
86
+ pin_idx = pin % ASPEED_GPIOS_PER_SET;
87
+
88
+ if (set_idx >= agc->nr_gpio_sets) {
89
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: set index: %d, out of bounds\n",
90
+ __func__, set_idx);
91
+ return 0;
92
+ }
93
+
94
+ set = &s->sets[set_idx];
95
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_OUT_DATA,
96
+ extract32(set->data_read, pin_idx, 1));
97
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_DIRECTION,
98
+ extract32(set->direction, pin_idx, 1));
99
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_INT_ENABLE,
100
+ extract32(set->int_enable, pin_idx, 1));
101
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_INT_SENS_0,
102
+ extract32(set->int_sens_0, pin_idx, 1));
103
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_INT_SENS_1,
104
+ extract32(set->int_sens_1, pin_idx, 1));
105
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_INT_SENS_2,
106
+ extract32(set->int_sens_2, pin_idx, 1));
107
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_RESET_TOLERANCE,
108
+ extract32(set->reset_tol, pin_idx, 1));
109
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_DEBOUNCE_1,
110
+ extract32(set->debounce_1, pin_idx, 1));
111
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_DEBOUNCE_2,
112
+ extract32(set->debounce_2, pin_idx, 1));
113
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_INPUT_MASK,
114
+ extract32(set->input_mask, pin_idx, 1));
115
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_INT_STATUS,
116
+ extract32(set->int_status, pin_idx, 1));
117
+ value = SHARED_FIELD_DP32(value, GPIO_CONTROL_IN_DATA,
118
+ extract32(set->data_value, pin_idx, 1));
119
+ return value;
120
+}
68
+}
121
+
69
+
122
+static void aspeed_gpio_2700_write_control_reg(AspeedGPIOState *s,
70
+static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
123
+ uint32_t pin, uint64_t data)
124
+{
71
+{
125
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
72
+ return qtest_readl(data->s, data->spi_base + offset);
126
+ const GPIOSetProperties *props;
127
+ GPIOSets *set;
128
+ uint32_t set_idx;
129
+ uint32_t pin_idx;
130
+ uint32_t group_value = 0;
131
+ uint32_t pending = 0;
132
+
133
+ set_idx = pin / ASPEED_GPIOS_PER_SET;
134
+ pin_idx = pin % ASPEED_GPIOS_PER_SET;
135
+
136
+ if (set_idx >= agc->nr_gpio_sets) {
137
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: set index: %d, out of bounds\n",
138
+ __func__, set_idx);
139
+ return;
140
+ }
141
+
142
+ set = &s->sets[set_idx];
143
+ props = &agc->props[set_idx];
144
+
145
+ /* direction */
146
+ group_value = set->direction;
147
+ group_value = deposit32(group_value, pin_idx, 1,
148
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_DIRECTION));
149
+ /*
150
+ * where data is the value attempted to be written to the pin:
151
+ * pin type | input mask | output mask | expected value
152
+ * ------------------------------------------------------------
153
+ * bidirectional | 1 | 1 | data
154
+ * input only | 1 | 0 | 0
155
+ * output only | 0 | 1 | 1
156
+ * no pin | 0 | 0 | 0
157
+ *
158
+ * which is captured by:
159
+ * data = ( data | ~input) & output;
160
+ */
161
+ group_value = (group_value | ~props->input) & props->output;
162
+ set->direction = update_value_control_source(set, set->direction,
163
+ group_value);
164
+
165
+ /* out data */
166
+ group_value = set->data_read;
167
+ group_value = deposit32(group_value, pin_idx, 1,
168
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_OUT_DATA));
169
+ group_value &= props->output;
170
+ group_value = update_value_control_source(set, set->data_read,
171
+ group_value);
172
+ set->data_read = group_value;
173
+
174
+ /* interrupt enable */
175
+ group_value = set->int_enable;
176
+ group_value = deposit32(group_value, pin_idx, 1,
177
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_INT_ENABLE));
178
+ set->int_enable = update_value_control_source(set, set->int_enable,
179
+ group_value);
180
+
181
+ /* interrupt sensitivity type 0 */
182
+ group_value = set->int_sens_0;
183
+ group_value = deposit32(group_value, pin_idx, 1,
184
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_INT_SENS_0));
185
+ set->int_sens_0 = update_value_control_source(set, set->int_sens_0,
186
+ group_value);
187
+
188
+ /* interrupt sensitivity type 1 */
189
+ group_value = set->int_sens_1;
190
+ group_value = deposit32(group_value, pin_idx, 1,
191
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_INT_SENS_1));
192
+ set->int_sens_1 = update_value_control_source(set, set->int_sens_1,
193
+ group_value);
194
+
195
+ /* interrupt sensitivity type 2 */
196
+ group_value = set->int_sens_2;
197
+ group_value = deposit32(group_value, pin_idx, 1,
198
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_INT_SENS_2));
199
+ set->int_sens_2 = update_value_control_source(set, set->int_sens_2,
200
+ group_value);
201
+
202
+ /* reset tolerance enable */
203
+ group_value = set->reset_tol;
204
+ group_value = deposit32(group_value, pin_idx, 1,
205
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_RESET_TOLERANCE));
206
+ set->reset_tol = update_value_control_source(set, set->reset_tol,
207
+ group_value);
208
+
209
+ /* debounce 1 */
210
+ group_value = set->debounce_1;
211
+ group_value = deposit32(group_value, pin_idx, 1,
212
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_DEBOUNCE_1));
213
+ set->debounce_1 = update_value_control_source(set, set->debounce_1,
214
+ group_value);
215
+
216
+ /* debounce 2 */
217
+ group_value = set->debounce_2;
218
+ group_value = deposit32(group_value, pin_idx, 1,
219
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_DEBOUNCE_2));
220
+ set->debounce_2 = update_value_control_source(set, set->debounce_2,
221
+ group_value);
222
+
223
+ /* input mask */
224
+ group_value = set->input_mask;
225
+ group_value = deposit32(group_value, pin_idx, 1,
226
+ SHARED_FIELD_EX32(data, GPIO_CONTROL_INPUT_MASK));
227
+ /*
228
+ * feeds into interrupt generation
229
+ * 0: read from data value reg will be updated
230
+ * 1: read from data value reg will not be updated
231
+ */
232
+ set->input_mask = group_value & props->input;
233
+
234
+ /* blink counter 1 */
235
+ /* blink counter 2 */
236
+ /* unimplement */
237
+
238
+ /* interrupt status */
239
+ if (SHARED_FIELD_EX32(data, GPIO_CONTROL_INT_STATUS)) {
240
+ /* pending is either 1 or 0 for a 1-bit field */
241
+ pending = extract32(set->int_status, pin_idx, 1);
242
+
243
+ assert(s->pending >= pending);
244
+
245
+ /* No change to s->pending if pending is 0 */
246
+ s->pending -= pending;
247
+
248
+ /*
249
+ * The write acknowledged the interrupt regardless of whether it
250
+ * was pending or not. The post-condition is that it mustn't be
251
+ * pending. Unconditionally clear the status bit.
252
+ */
253
+ set->int_status = deposit32(set->int_status, pin_idx, 1, 0);
254
+ }
255
+
256
+ aspeed_gpio_update(s, set, set->data_value, UINT32_MAX);
257
+ return;
258
+}
73
+}
259
+
74
+
260
+static uint64_t aspeed_gpio_2700_read(void *opaque, hwaddr offset,
75
+static inline void flash_writeb(const TestData *data, uint64_t offset,
261
+ uint32_t size)
76
+ uint8_t value)
262
+{
77
+{
263
+ AspeedGPIOState *s = ASPEED_GPIO(opaque);
78
+ qtest_writeb(data->s, data->flash_base + offset, value);
264
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
265
+ GPIOSets *set;
266
+ uint64_t value;
267
+ uint64_t reg;
268
+ uint32_t pin;
269
+ uint32_t idx;
270
+
271
+ reg = offset >> 2;
272
+
273
+ if (reg >= agc->reg_table_count) {
274
+ qemu_log_mask(LOG_GUEST_ERROR,
275
+ "%s: offset 0x%" PRIx64 " out of bounds\n",
276
+ __func__, offset);
277
+ return 0;
278
+ }
279
+
280
+ switch (reg) {
281
+ case R_GPIO_2700_DEBOUNCE_TIME_1 ... R_GPIO_2700_DEBOUNCE_TIME_3:
282
+ idx = reg - R_GPIO_2700_DEBOUNCE_TIME_1;
283
+
284
+ if (idx >= ASPEED_GPIO_NR_DEBOUNCE_REGS) {
285
+ qemu_log_mask(LOG_GUEST_ERROR,
286
+ "%s: debounce index: %d, out of bounds\n",
287
+ __func__, idx);
288
+ return 0;
289
+ }
290
+
291
+ value = (uint64_t) s->debounce_regs[idx];
292
+ break;
293
+ case R_GPIO_2700_INT_STATUS_1 ... R_GPIO_2700_INT_STATUS_7:
294
+ idx = reg - R_GPIO_2700_INT_STATUS_1;
295
+
296
+ if (idx >= agc->nr_gpio_sets) {
297
+ qemu_log_mask(LOG_GUEST_ERROR,
298
+ "%s: interrupt status index: %d, out of bounds\n",
299
+ __func__, idx);
300
+ return 0;
301
+ }
302
+
303
+ set = &s->sets[idx];
304
+ value = (uint64_t) set->int_status;
305
+ break;
306
+ case R_GPIO_A0_CONTROL ... R_GPIO_AA7_CONTROL:
307
+ pin = reg - R_GPIO_A0_CONTROL;
308
+
309
+ if (pin >= agc->nr_gpio_pins) {
310
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid pin number: %d\n",
311
+ __func__, pin);
312
+ return 0;
313
+ }
314
+
315
+ value = aspeed_gpio_2700_read_control_reg(s, pin);
316
+ break;
317
+ default:
318
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no getter for offset 0x%"
319
+ PRIx64"\n", __func__, offset);
320
+ return 0;
321
+ }
322
+
323
+ trace_aspeed_gpio_read(offset, value);
324
+ return value;
325
+}
79
+}
326
+
80
+
327
+static void aspeed_gpio_2700_write(void *opaque, hwaddr offset,
81
+static inline void flash_writel(const TestData *data, uint64_t offset,
328
+ uint64_t data, uint32_t size)
82
+ uint32_t value)
329
+{
83
+{
330
+ AspeedGPIOState *s = ASPEED_GPIO(opaque);
84
+ qtest_writel(data->s, data->flash_base + offset, value);
331
+ AspeedGPIOClass *agc = ASPEED_GPIO_GET_CLASS(s);
332
+ uint64_t reg;
333
+ uint32_t pin;
334
+ uint32_t idx;
335
+
336
+ trace_aspeed_gpio_write(offset, data);
337
+
338
+ reg = offset >> 2;
339
+
340
+ if (reg >= agc->reg_table_count) {
341
+ qemu_log_mask(LOG_GUEST_ERROR,
342
+ "%s: offset 0x%" PRIx64 " out of bounds\n",
343
+ __func__, offset);
344
+ return;
345
+ }
346
+
347
+ switch (reg) {
348
+ case R_GPIO_2700_DEBOUNCE_TIME_1 ... R_GPIO_2700_DEBOUNCE_TIME_3:
349
+ idx = reg - R_GPIO_2700_DEBOUNCE_TIME_1;
350
+
351
+ if (idx >= ASPEED_GPIO_NR_DEBOUNCE_REGS) {
352
+ qemu_log_mask(LOG_GUEST_ERROR,
353
+ "%s: debounce index: %d out of bounds\n",
354
+ __func__, idx);
355
+ return;
356
+ }
357
+
358
+ s->debounce_regs[idx] = (uint32_t) data;
359
+ break;
360
+ case R_GPIO_A0_CONTROL ... R_GPIO_AA7_CONTROL:
361
+ pin = reg - R_GPIO_A0_CONTROL;
362
+
363
+ if (pin >= agc->nr_gpio_pins) {
364
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid pin number: %d\n",
365
+ __func__, pin);
366
+ return;
367
+ }
368
+
369
+ if (SHARED_FIELD_EX32(data, GPIO_CONTROL_RESERVED)) {
370
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid reserved data: 0x%"
371
+ PRIx64"\n", __func__, data);
372
+ return;
373
+ }
374
+
375
+ aspeed_gpio_2700_write_control_reg(s, pin, data);
376
+ break;
377
+ default:
378
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: no setter for offset 0x%"
379
+ PRIx64"\n", __func__, offset);
380
+ break;
381
+ }
382
+
383
+ return;
384
+}
85
+}
385
+
86
+
386
/* Setup functions */
87
+static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
387
static const GPIOSetProperties ast2400_set_props[ASPEED_GPIO_MAX_NR_SETS] = {
88
{
388
[0] = {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} },
89
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
389
@@ -XXX,XX +XXX,XX @@ static GPIOSetProperties ast1030_set_props[ASPEED_GPIO_MAX_NR_SETS] = {
90
+ return qtest_readb(data->s, data->flash_base + offset);
390
[5] = {0x000000ff, 0x00000000, {"U"} },
391
};
392
393
+static GPIOSetProperties ast2700_set_props[ASPEED_GPIO_MAX_NR_SETS] = {
394
+ [0] = {0xffffffff, 0xffffffff, {"A", "B", "C", "D"} },
395
+ [1] = {0x0fffffff, 0x0fffffff, {"E", "F", "G", "H"} },
396
+ [2] = {0xffffffff, 0xffffffff, {"I", "J", "K", "L"} },
397
+ [3] = {0xffffffff, 0xffffffff, {"M", "N", "O", "P"} },
398
+ [4] = {0xffffffff, 0xffffffff, {"Q", "R", "S", "T"} },
399
+ [5] = {0xffffffff, 0xffffffff, {"U", "V", "W", "X"} },
400
+ [6] = {0x00ffffff, 0x00ffffff, {"Y", "Z", "AA"} },
401
+};
402
+
403
static const MemoryRegionOps aspeed_gpio_ops = {
404
.read = aspeed_gpio_read,
405
.write = aspeed_gpio_write,
406
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_gpio_ops = {
407
.valid.max_access_size = 4,
408
};
409
410
+static const MemoryRegionOps aspeed_gpio_2700_ops = {
411
+ .read = aspeed_gpio_2700_read,
412
+ .write = aspeed_gpio_2700_write,
413
+ .endianness = DEVICE_LITTLE_ENDIAN,
414
+ .valid.min_access_size = 4,
415
+ .valid.max_access_size = 4,
416
+};
417
+
418
static void aspeed_gpio_reset(DeviceState *dev)
419
{
420
AspeedGPIOState *s = ASPEED_GPIO(dev);
421
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_1030_class_init(ObjectClass *klass, void *data)
422
agc->reg_ops = &aspeed_gpio_ops;
423
}
424
425
+static void aspeed_gpio_2700_class_init(ObjectClass *klass, void *data)
426
+{
427
+ AspeedGPIOClass *agc = ASPEED_GPIO_CLASS(klass);
428
+
429
+ agc->props = ast2700_set_props;
430
+ agc->nr_gpio_pins = 216;
431
+ agc->nr_gpio_sets = 7;
432
+ agc->reg_table_count = GPIO_2700_REG_ARRAY_SIZE;
433
+ agc->mem_size = 0x1000;
434
+ agc->reg_ops = &aspeed_gpio_2700_ops;
435
+}
91
+}
436
+
92
+
437
static const TypeInfo aspeed_gpio_info = {
93
+static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
438
.name = TYPE_ASPEED_GPIO,
94
+{
439
.parent = TYPE_SYS_BUS_DEVICE,
95
+ return qtest_readl(data->s, data->flash_base + offset);
440
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_gpio_ast1030_info = {
96
+}
441
.instance_init = aspeed_gpio_init,
442
};
443
444
+static const TypeInfo aspeed_gpio_ast2700_info = {
445
+ .name = TYPE_ASPEED_GPIO "-ast2700",
446
+ .parent = TYPE_ASPEED_GPIO,
447
+ .class_init = aspeed_gpio_2700_class_init,
448
+ .instance_init = aspeed_gpio_init,
449
+};
450
+
97
+
451
static void aspeed_gpio_register_types(void)
98
+static void spi_conf(const TestData *data, uint32_t value)
452
{
99
+{
453
type_register_static(&aspeed_gpio_info);
100
+ uint32_t conf = spi_readl(data, R_CONF);
454
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_register_types(void)
101
455
type_register_static(&aspeed_gpio_ast2600_3_3v_info);
102
conf |= value;
456
type_register_static(&aspeed_gpio_ast2600_1_8v_info);
103
- writel(ASPEED_FMC_BASE + R_CONF, conf);
457
type_register_static(&aspeed_gpio_ast1030_info);
104
+ spi_writel(data, R_CONF, conf);
458
+ type_register_static(&aspeed_gpio_ast2700_info);
105
}
459
}
106
460
107
-static void spi_conf_remove(uint32_t value)
461
type_init(aspeed_gpio_register_types);
108
+static void spi_conf_remove(const TestData *data, uint32_t value)
109
{
110
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
111
+ uint32_t conf = spi_readl(data, R_CONF);
112
113
conf &= ~value;
114
- writel(ASPEED_FMC_BASE + R_CONF, conf);
115
+ spi_writel(data, R_CONF, conf);
116
}
117
118
-static void spi_ce_ctrl(uint32_t value)
119
+static void spi_ce_ctrl(const TestData *data, uint32_t value)
120
{
121
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CE_CTRL);
122
+ uint32_t conf = spi_readl(data, R_CE_CTRL);
123
124
conf |= value;
125
- writel(ASPEED_FMC_BASE + R_CE_CTRL, conf);
126
+ spi_writel(data, R_CE_CTRL, conf);
127
}
128
129
-static void spi_ctrl_setmode(uint8_t mode, uint8_t cmd)
130
+static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
131
{
132
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
133
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
134
ctrl &= ~(CTRL_USERMODE | 0xff << 16);
135
ctrl |= mode | (cmd << 16);
136
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
137
+ spi_writel(data, R_CTRL0, ctrl);
138
}
139
140
-static void spi_ctrl_start_user(void)
141
+static void spi_ctrl_start_user(const TestData *data)
142
{
143
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
144
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
145
146
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
147
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
148
+ spi_writel(data, R_CTRL0, ctrl);
149
150
ctrl &= ~CTRL_CE_STOP_ACTIVE;
151
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
152
+ spi_writel(data, R_CTRL0, ctrl);
153
}
154
155
-static void spi_ctrl_stop_user(void)
156
+static void spi_ctrl_stop_user(const TestData *data)
157
{
158
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
159
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
160
161
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
162
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
163
+ spi_writel(data, R_CTRL0, ctrl);
164
}
165
166
-static void flash_reset(void)
167
+static void flash_reset(const TestData *data)
168
{
169
- spi_conf(CONF_ENABLE_W0);
170
+ spi_conf(data, CONF_ENABLE_W0);
171
172
- spi_ctrl_start_user();
173
- writeb(ASPEED_FLASH_BASE, RESET_ENABLE);
174
- writeb(ASPEED_FLASH_BASE, RESET_MEMORY);
175
- writeb(ASPEED_FLASH_BASE, WREN);
176
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
177
- writeb(ASPEED_FLASH_BASE, WRDI);
178
- spi_ctrl_stop_user();
179
+ spi_ctrl_start_user(data);
180
+ flash_writeb(data, 0, RESET_ENABLE);
181
+ flash_writeb(data, 0, RESET_MEMORY);
182
+ flash_writeb(data, 0, WREN);
183
+ flash_writeb(data, 0, BULK_ERASE);
184
+ flash_writeb(data, 0, WRDI);
185
+ spi_ctrl_stop_user(data);
186
187
- spi_conf_remove(CONF_ENABLE_W0);
188
+ spi_conf_remove(data, CONF_ENABLE_W0);
189
}
190
191
-static void test_read_jedec(void)
192
+static void test_read_jedec(const void *data)
193
{
194
+ const TestData *test_data = (const TestData *)data;
195
uint32_t jedec = 0x0;
196
197
- spi_conf(CONF_ENABLE_W0);
198
+ spi_conf(test_data, CONF_ENABLE_W0);
199
200
- spi_ctrl_start_user();
201
- writeb(ASPEED_FLASH_BASE, JEDEC_READ);
202
- jedec |= readb(ASPEED_FLASH_BASE) << 16;
203
- jedec |= readb(ASPEED_FLASH_BASE) << 8;
204
- jedec |= readb(ASPEED_FLASH_BASE);
205
- spi_ctrl_stop_user();
206
+ spi_ctrl_start_user(test_data);
207
+ flash_writeb(test_data, 0, JEDEC_READ);
208
+ jedec |= flash_readb(test_data, 0) << 16;
209
+ jedec |= flash_readb(test_data, 0) << 8;
210
+ jedec |= flash_readb(test_data, 0);
211
+ spi_ctrl_stop_user(test_data);
212
213
- flash_reset();
214
+ flash_reset(test_data);
215
216
- g_assert_cmphex(jedec, ==, FLASH_JEDEC);
217
+ g_assert_cmphex(jedec, ==, test_data->jedec_id);
218
}
219
220
-static void read_page(uint32_t addr, uint32_t *page)
221
+static void read_page(const TestData *data, uint32_t addr, uint32_t *page)
222
{
223
int i;
224
225
- spi_ctrl_start_user();
226
+ spi_ctrl_start_user(data);
227
228
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
229
- writeb(ASPEED_FLASH_BASE, READ);
230
- writel(ASPEED_FLASH_BASE, make_be32(addr));
231
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
232
+ flash_writeb(data, 0, READ);
233
+ flash_writel(data, 0, make_be32(addr));
234
235
/* Continuous read are supported */
236
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
237
- page[i] = make_be32(readl(ASPEED_FLASH_BASE));
238
+ page[i] = make_be32(flash_readl(data, 0));
239
}
240
- spi_ctrl_stop_user();
241
+ spi_ctrl_stop_user(data);
242
}
243
244
-static void read_page_mem(uint32_t addr, uint32_t *page)
245
+static void read_page_mem(const TestData *data, uint32_t addr, uint32_t *page)
246
{
247
int i;
248
249
/* move out USER mode to use direct reads from the AHB bus */
250
- spi_ctrl_setmode(CTRL_READMODE, READ);
251
+ spi_ctrl_setmode(data, CTRL_READMODE, READ);
252
253
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
254
- page[i] = make_be32(readl(ASPEED_FLASH_BASE + addr + i * 4));
255
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
256
}
257
}
258
259
-static void write_page_mem(uint32_t addr, uint32_t write_value)
260
+static void write_page_mem(const TestData *data, uint32_t addr,
261
+ uint32_t write_value)
262
{
263
- spi_ctrl_setmode(CTRL_WRITEMODE, PP);
264
+ spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
265
266
for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
267
- writel(ASPEED_FLASH_BASE + addr + i * 4, write_value);
268
+ flash_writel(data, addr + i * 4, write_value);
269
}
270
}
271
272
-static void assert_page_mem(uint32_t addr, uint32_t expected_value)
273
+static void assert_page_mem(const TestData *data, uint32_t addr,
274
+ uint32_t expected_value)
275
{
276
uint32_t page[FLASH_PAGE_SIZE / 4];
277
- read_page_mem(addr, page);
278
+ read_page_mem(data, addr, page);
279
for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
280
g_assert_cmphex(page[i], ==, expected_value);
281
}
282
}
283
284
-static void test_erase_sector(void)
285
+static void test_erase_sector(const void *data)
286
{
287
+ const TestData *test_data = (const TestData *)data;
288
uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
289
uint32_t page[FLASH_PAGE_SIZE / 4];
290
int i;
291
292
- spi_conf(CONF_ENABLE_W0);
293
+ spi_conf(test_data, CONF_ENABLE_W0);
294
295
/*
296
* Previous page should be full of 0xffs after backend is
297
* initialized
298
*/
299
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
300
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
301
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
302
g_assert_cmphex(page[i], ==, 0xffffffff);
303
}
304
305
- spi_ctrl_start_user();
306
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
307
- writeb(ASPEED_FLASH_BASE, WREN);
308
- writeb(ASPEED_FLASH_BASE, PP);
309
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
310
+ spi_ctrl_start_user(test_data);
311
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
312
+ flash_writeb(test_data, 0, WREN);
313
+ flash_writeb(test_data, 0, PP);
314
+ flash_writel(test_data, 0, make_be32(some_page_addr));
315
316
/* Fill the page with its own addresses */
317
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
318
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
319
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
320
}
321
- spi_ctrl_stop_user();
322
+ spi_ctrl_stop_user(test_data);
323
324
/* Check the page is correctly written */
325
- read_page(some_page_addr, page);
326
+ read_page(test_data, some_page_addr, page);
327
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
328
g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
329
}
330
331
- spi_ctrl_start_user();
332
- writeb(ASPEED_FLASH_BASE, WREN);
333
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
334
- writeb(ASPEED_FLASH_BASE, ERASE_SECTOR);
335
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
336
- spi_ctrl_stop_user();
337
+ spi_ctrl_start_user(test_data);
338
+ flash_writeb(test_data, 0, WREN);
339
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
340
+ flash_writeb(test_data, 0, ERASE_SECTOR);
341
+ flash_writel(test_data, 0, make_be32(some_page_addr));
342
+ spi_ctrl_stop_user(test_data);
343
344
/* Check the page is erased */
345
- read_page(some_page_addr, page);
346
+ read_page(test_data, some_page_addr, page);
347
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
348
g_assert_cmphex(page[i], ==, 0xffffffff);
349
}
350
351
- flash_reset();
352
+ flash_reset(test_data);
353
}
354
355
-static void test_erase_all(void)
356
+static void test_erase_all(const void *data)
357
{
358
+ const TestData *test_data = (const TestData *)data;
359
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
360
uint32_t page[FLASH_PAGE_SIZE / 4];
361
int i;
362
363
- spi_conf(CONF_ENABLE_W0);
364
+ spi_conf(test_data, CONF_ENABLE_W0);
365
366
/*
367
* Previous page should be full of 0xffs after backend is
368
* initialized
369
*/
370
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
371
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
372
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
373
g_assert_cmphex(page[i], ==, 0xffffffff);
374
}
375
376
- spi_ctrl_start_user();
377
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
378
- writeb(ASPEED_FLASH_BASE, WREN);
379
- writeb(ASPEED_FLASH_BASE, PP);
380
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
381
+ spi_ctrl_start_user(test_data);
382
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
383
+ flash_writeb(test_data, 0, WREN);
384
+ flash_writeb(test_data, 0, PP);
385
+ flash_writel(test_data, 0, make_be32(some_page_addr));
386
387
/* Fill the page with its own addresses */
388
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
389
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
390
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
391
}
392
- spi_ctrl_stop_user();
393
+ spi_ctrl_stop_user(test_data);
394
395
/* Check the page is correctly written */
396
- read_page(some_page_addr, page);
397
+ read_page(test_data, some_page_addr, page);
398
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
399
g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
400
}
401
402
- spi_ctrl_start_user();
403
- writeb(ASPEED_FLASH_BASE, WREN);
404
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
405
- spi_ctrl_stop_user();
406
+ spi_ctrl_start_user(test_data);
407
+ flash_writeb(test_data, 0, WREN);
408
+ flash_writeb(test_data, 0, BULK_ERASE);
409
+ spi_ctrl_stop_user(test_data);
410
411
/* Check the page is erased */
412
- read_page(some_page_addr, page);
413
+ read_page(test_data, some_page_addr, page);
414
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
415
g_assert_cmphex(page[i], ==, 0xffffffff);
416
}
417
418
- flash_reset();
419
+ flash_reset(test_data);
420
}
421
422
-static void test_write_page(void)
423
+static void test_write_page(const void *data)
424
{
425
+ const TestData *test_data = (const TestData *)data;
426
uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
427
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
428
uint32_t page[FLASH_PAGE_SIZE / 4];
429
int i;
430
431
- spi_conf(CONF_ENABLE_W0);
432
+ spi_conf(test_data, CONF_ENABLE_W0);
433
434
- spi_ctrl_start_user();
435
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
436
- writeb(ASPEED_FLASH_BASE, WREN);
437
- writeb(ASPEED_FLASH_BASE, PP);
438
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
439
+ spi_ctrl_start_user(test_data);
440
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
441
+ flash_writeb(test_data, 0, WREN);
442
+ flash_writeb(test_data, 0, PP);
443
+ flash_writel(test_data, 0, make_be32(my_page_addr));
444
445
/* Fill the page with its own addresses */
446
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
447
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
448
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
449
}
450
- spi_ctrl_stop_user();
451
+ spi_ctrl_stop_user(test_data);
452
453
/* Check what was written */
454
- read_page(my_page_addr, page);
455
+ read_page(test_data, my_page_addr, page);
456
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
457
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
458
}
459
460
/* Check some other page. It should be full of 0xff */
461
- read_page(some_page_addr, page);
462
+ read_page(test_data, some_page_addr, page);
463
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
464
g_assert_cmphex(page[i], ==, 0xffffffff);
465
}
466
467
- flash_reset();
468
+ flash_reset(test_data);
469
}
470
471
-static void test_read_page_mem(void)
472
+static void test_read_page_mem(const void *data)
473
{
474
+ const TestData *test_data = (const TestData *)data;
475
uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
476
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
477
uint32_t page[FLASH_PAGE_SIZE / 4];
478
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(void)
479
* Enable 4BYTE mode for controller. This is should be strapped by
480
* HW for CE0 anyhow.
481
*/
482
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
483
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
484
485
/* Enable 4BYTE mode for flash. */
486
- spi_conf(CONF_ENABLE_W0);
487
- spi_ctrl_start_user();
488
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
489
- writeb(ASPEED_FLASH_BASE, WREN);
490
- writeb(ASPEED_FLASH_BASE, PP);
491
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
492
+ spi_conf(test_data, CONF_ENABLE_W0);
493
+ spi_ctrl_start_user(test_data);
494
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
495
+ flash_writeb(test_data, 0, WREN);
496
+ flash_writeb(test_data, 0, PP);
497
+ flash_writel(test_data, 0, make_be32(my_page_addr));
498
499
/* Fill the page with its own addresses */
500
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
501
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
502
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
503
}
504
- spi_ctrl_stop_user();
505
- spi_conf_remove(CONF_ENABLE_W0);
506
+ spi_ctrl_stop_user(test_data);
507
+ spi_conf_remove(test_data, CONF_ENABLE_W0);
508
509
/* Check what was written */
510
- read_page_mem(my_page_addr, page);
511
+ read_page_mem(test_data, my_page_addr, page);
512
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
513
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
514
}
515
516
/* Check some other page. It should be full of 0xff */
517
- read_page_mem(some_page_addr, page);
518
+ read_page_mem(test_data, some_page_addr, page);
519
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
520
g_assert_cmphex(page[i], ==, 0xffffffff);
521
}
522
523
- flash_reset();
524
+ flash_reset(test_data);
525
}
526
527
-static void test_write_page_mem(void)
528
+static void test_write_page_mem(const void *data)
529
{
530
+ const TestData *test_data = (const TestData *)data;
531
uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
532
uint32_t page[FLASH_PAGE_SIZE / 4];
533
int i;
534
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(void)
535
* Enable 4BYTE mode for controller. This is should be strapped by
536
* HW for CE0 anyhow.
537
*/
538
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
539
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
540
541
/* Enable 4BYTE mode for flash. */
542
- spi_conf(CONF_ENABLE_W0);
543
- spi_ctrl_start_user();
544
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
545
- writeb(ASPEED_FLASH_BASE, WREN);
546
- spi_ctrl_stop_user();
547
+ spi_conf(test_data, CONF_ENABLE_W0);
548
+ spi_ctrl_start_user(test_data);
549
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
550
+ flash_writeb(test_data, 0, WREN);
551
+ spi_ctrl_stop_user(test_data);
552
553
/* move out USER mode to use direct writes to the AHB bus */
554
- spi_ctrl_setmode(CTRL_WRITEMODE, PP);
555
+ spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
556
557
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
558
- writel(ASPEED_FLASH_BASE + my_page_addr + i * 4,
559
+ flash_writel(test_data, my_page_addr + i * 4,
560
make_be32(my_page_addr + i * 4));
561
}
562
563
/* Check what was written */
564
- read_page_mem(my_page_addr, page);
565
+ read_page_mem(test_data, my_page_addr, page);
566
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
567
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
568
}
569
570
- flash_reset();
571
+ flash_reset(test_data);
572
}
573
574
-static void test_read_status_reg(void)
575
+static void test_read_status_reg(const void *data)
576
{
577
+ const TestData *test_data = (const TestData *)data;
578
uint8_t r;
579
580
- spi_conf(CONF_ENABLE_W0);
581
+ spi_conf(test_data, CONF_ENABLE_W0);
582
583
- spi_ctrl_start_user();
584
- writeb(ASPEED_FLASH_BASE, RDSR);
585
- r = readb(ASPEED_FLASH_BASE);
586
- spi_ctrl_stop_user();
587
+ spi_ctrl_start_user(test_data);
588
+ flash_writeb(test_data, 0, RDSR);
589
+ r = flash_readb(test_data, 0);
590
+ spi_ctrl_stop_user(test_data);
591
592
g_assert_cmphex(r & SR_WEL, ==, 0);
593
g_assert(!qtest_qom_get_bool
594
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
595
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
596
597
- spi_ctrl_start_user();
598
- writeb(ASPEED_FLASH_BASE, WREN);
599
- writeb(ASPEED_FLASH_BASE, RDSR);
600
- r = readb(ASPEED_FLASH_BASE);
601
- spi_ctrl_stop_user();
602
+ spi_ctrl_start_user(test_data);
603
+ flash_writeb(test_data, 0, WREN);
604
+ flash_writeb(test_data, 0, RDSR);
605
+ r = flash_readb(test_data, 0);
606
+ spi_ctrl_stop_user(test_data);
607
608
g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
609
g_assert(qtest_qom_get_bool
610
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
611
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
612
613
- spi_ctrl_start_user();
614
- writeb(ASPEED_FLASH_BASE, WRDI);
615
- writeb(ASPEED_FLASH_BASE, RDSR);
616
- r = readb(ASPEED_FLASH_BASE);
617
- spi_ctrl_stop_user();
618
+ spi_ctrl_start_user(test_data);
619
+ flash_writeb(test_data, 0, WRDI);
620
+ flash_writeb(test_data, 0, RDSR);
621
+ r = flash_readb(test_data, 0);
622
+ spi_ctrl_stop_user(test_data);
623
624
g_assert_cmphex(r & SR_WEL, ==, 0);
625
g_assert(!qtest_qom_get_bool
626
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
627
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
628
629
- flash_reset();
630
+ flash_reset(test_data);
631
}
632
633
-static void test_status_reg_write_protection(void)
634
+static void test_status_reg_write_protection(const void *data)
635
{
636
+ const TestData *test_data = (const TestData *)data;
637
uint8_t r;
638
639
- spi_conf(CONF_ENABLE_W0);
640
+ spi_conf(test_data, CONF_ENABLE_W0);
641
642
/* default case: WP# is high and SRWD is low -> status register writable */
643
- spi_ctrl_start_user();
644
- writeb(ASPEED_FLASH_BASE, WREN);
645
+ spi_ctrl_start_user(test_data);
646
+ flash_writeb(test_data, 0, WREN);
647
/* test ability to write SRWD */
648
- writeb(ASPEED_FLASH_BASE, WRSR);
649
- writeb(ASPEED_FLASH_BASE, SRWD);
650
- writeb(ASPEED_FLASH_BASE, RDSR);
651
- r = readb(ASPEED_FLASH_BASE);
652
- spi_ctrl_stop_user();
653
+ flash_writeb(test_data, 0, WRSR);
654
+ flash_writeb(test_data, 0, SRWD);
655
+ flash_writeb(test_data, 0, RDSR);
656
+ r = flash_readb(test_data, 0);
657
+ spi_ctrl_stop_user(test_data);
658
g_assert_cmphex(r & SRWD, ==, SRWD);
659
660
/* WP# high and SRWD high -> status register writable */
661
- spi_ctrl_start_user();
662
- writeb(ASPEED_FLASH_BASE, WREN);
663
+ spi_ctrl_start_user(test_data);
664
+ flash_writeb(test_data, 0, WREN);
665
/* test ability to write SRWD */
666
- writeb(ASPEED_FLASH_BASE, WRSR);
667
- writeb(ASPEED_FLASH_BASE, 0);
668
- writeb(ASPEED_FLASH_BASE, RDSR);
669
- r = readb(ASPEED_FLASH_BASE);
670
- spi_ctrl_stop_user();
671
+ flash_writeb(test_data, 0, WRSR);
672
+ flash_writeb(test_data, 0, 0);
673
+ flash_writeb(test_data, 0, RDSR);
674
+ r = flash_readb(test_data, 0);
675
+ spi_ctrl_stop_user(test_data);
676
g_assert_cmphex(r & SRWD, ==, 0);
677
678
/* WP# low and SRWD low -> status register writable */
679
- qtest_set_irq_in(global_qtest,
680
+ qtest_set_irq_in(test_data->s,
681
"/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 0);
682
- spi_ctrl_start_user();
683
- writeb(ASPEED_FLASH_BASE, WREN);
684
+ spi_ctrl_start_user(test_data);
685
+ flash_writeb(test_data, 0, WREN);
686
/* test ability to write SRWD */
687
- writeb(ASPEED_FLASH_BASE, WRSR);
688
- writeb(ASPEED_FLASH_BASE, SRWD);
689
- writeb(ASPEED_FLASH_BASE, RDSR);
690
- r = readb(ASPEED_FLASH_BASE);
691
- spi_ctrl_stop_user();
692
+ flash_writeb(test_data, 0, WRSR);
693
+ flash_writeb(test_data, 0, SRWD);
694
+ flash_writeb(test_data, 0, RDSR);
695
+ r = flash_readb(test_data, 0);
696
+ spi_ctrl_stop_user(test_data);
697
g_assert_cmphex(r & SRWD, ==, SRWD);
698
699
/* WP# low and SRWD high -> status register NOT writable */
700
- spi_ctrl_start_user();
701
- writeb(ASPEED_FLASH_BASE, WREN);
702
+ spi_ctrl_start_user(test_data);
703
+ flash_writeb(test_data, 0 , WREN);
704
/* test ability to write SRWD */
705
- writeb(ASPEED_FLASH_BASE, WRSR);
706
- writeb(ASPEED_FLASH_BASE, 0);
707
- writeb(ASPEED_FLASH_BASE, RDSR);
708
- r = readb(ASPEED_FLASH_BASE);
709
- spi_ctrl_stop_user();
710
+ flash_writeb(test_data, 0, WRSR);
711
+ flash_writeb(test_data, 0, 0);
712
+ flash_writeb(test_data, 0, RDSR);
713
+ r = flash_readb(test_data, 0);
714
+ spi_ctrl_stop_user(test_data);
715
/* write is not successful */
716
g_assert_cmphex(r & SRWD, ==, SRWD);
717
718
- qtest_set_irq_in(global_qtest,
719
+ qtest_set_irq_in(test_data->s,
720
"/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 1);
721
- flash_reset();
722
+ flash_reset(test_data);
723
}
724
725
-static void test_write_block_protect(void)
726
+static void test_write_block_protect(const void *data)
727
{
728
+ const TestData *test_data = (const TestData *)data;
729
uint32_t sector_size = 65536;
730
uint32_t n_sectors = 512;
731
732
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
733
- spi_conf(CONF_ENABLE_W0);
734
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
735
+ spi_conf(test_data, CONF_ENABLE_W0);
736
737
uint32_t bp_bits = 0b0;
738
739
for (int i = 0; i < 16; i++) {
740
bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
741
742
- spi_ctrl_start_user();
743
- writeb(ASPEED_FLASH_BASE, WREN);
744
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
745
- writeb(ASPEED_FLASH_BASE, WREN);
746
- writeb(ASPEED_FLASH_BASE, WRSR);
747
- writeb(ASPEED_FLASH_BASE, bp_bits);
748
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
749
- writeb(ASPEED_FLASH_BASE, WREN);
750
- spi_ctrl_stop_user();
751
+ spi_ctrl_start_user(test_data);
752
+ flash_writeb(test_data, 0, WREN);
753
+ flash_writeb(test_data, 0, BULK_ERASE);
754
+ flash_writeb(test_data, 0, WREN);
755
+ flash_writeb(test_data, 0, WRSR);
756
+ flash_writeb(test_data, 0, bp_bits);
757
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
758
+ flash_writeb(test_data, 0, WREN);
759
+ spi_ctrl_stop_user(test_data);
760
761
uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
762
uint32_t protection_start = n_sectors - num_protected_sectors;
763
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect(void)
764
for (int sector = 0; sector < n_sectors; sector++) {
765
uint32_t addr = sector * sector_size;
766
767
- assert_page_mem(addr, 0xffffffff);
768
- write_page_mem(addr, make_be32(0xabcdef12));
769
+ assert_page_mem(test_data, addr, 0xffffffff);
770
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
771
772
uint32_t expected_value = protection_start <= sector
773
&& sector < protection_end
774
? 0xffffffff : 0xabcdef12;
775
776
- assert_page_mem(addr, expected_value);
777
+ assert_page_mem(test_data, addr, expected_value);
778
}
779
}
780
781
- flash_reset();
782
+ flash_reset(test_data);
783
}
784
785
-static void test_write_block_protect_bottom_bit(void)
786
+static void test_write_block_protect_bottom_bit(const void *data)
787
{
788
+ const TestData *test_data = (const TestData *)data;
789
uint32_t sector_size = 65536;
790
uint32_t n_sectors = 512;
791
792
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
793
- spi_conf(CONF_ENABLE_W0);
794
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
795
+ spi_conf(test_data, CONF_ENABLE_W0);
796
797
/* top bottom bit is enabled */
798
uint32_t bp_bits = 0b00100 << 3;
799
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
800
for (int i = 0; i < 16; i++) {
801
bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
802
803
- spi_ctrl_start_user();
804
- writeb(ASPEED_FLASH_BASE, WREN);
805
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
806
- writeb(ASPEED_FLASH_BASE, WREN);
807
- writeb(ASPEED_FLASH_BASE, WRSR);
808
- writeb(ASPEED_FLASH_BASE, bp_bits);
809
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
810
- writeb(ASPEED_FLASH_BASE, WREN);
811
- spi_ctrl_stop_user();
812
+ spi_ctrl_start_user(test_data);
813
+ flash_writeb(test_data, 0, WREN);
814
+ flash_writeb(test_data, 0, BULK_ERASE);
815
+ flash_writeb(test_data, 0, WREN);
816
+ flash_writeb(test_data, 0, WRSR);
817
+ flash_writeb(test_data, 0, bp_bits);
818
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
819
+ flash_writeb(test_data, 0, WREN);
820
+ spi_ctrl_stop_user(test_data);
821
822
uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
823
uint32_t protection_start = 0;
824
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
825
for (int sector = 0; sector < n_sectors; sector++) {
826
uint32_t addr = sector * sector_size;
827
828
- assert_page_mem(addr, 0xffffffff);
829
- write_page_mem(addr, make_be32(0xabcdef12));
830
+ assert_page_mem(test_data, addr, 0xffffffff);
831
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
832
833
uint32_t expected_value = protection_start <= sector
834
&& sector < protection_end
835
? 0xffffffff : 0xabcdef12;
836
837
- assert_page_mem(addr, expected_value);
838
+ assert_page_mem(test_data, addr, expected_value);
839
}
840
}
841
842
- flash_reset();
843
+ flash_reset(test_data);
844
}
845
846
-static int test_palmetto_bmc(void)
847
+static void test_palmetto_bmc(TestData *data)
848
{
849
- g_autofree char *tmp_path = NULL;
850
int ret;
851
int fd;
852
853
- fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
854
+ fd = g_file_open_tmp("qtest.m25p80.n25q256a.XXXXXX", &data->tmp_path, NULL);
855
g_assert(fd >= 0);
856
- ret = ftruncate(fd, FLASH_SIZE);
857
+ ret = ftruncate(fd, 32 * 1024 * 1024);
858
g_assert(ret == 0);
859
close(fd);
860
861
- global_qtest = qtest_initf("-m 256 -machine palmetto-bmc "
862
- "-drive file=%s,format=raw,if=mtd",
863
- tmp_path);
864
-
865
- qtest_add_func("/ast2400/smc/read_jedec", test_read_jedec);
866
- qtest_add_func("/ast2400/smc/erase_sector", test_erase_sector);
867
- qtest_add_func("/ast2400/smc/erase_all", test_erase_all);
868
- qtest_add_func("/ast2400/smc/write_page", test_write_page);
869
- qtest_add_func("/ast2400/smc/read_page_mem", test_read_page_mem);
870
- qtest_add_func("/ast2400/smc/write_page_mem", test_write_page_mem);
871
- qtest_add_func("/ast2400/smc/read_status_reg", test_read_status_reg);
872
- qtest_add_func("/ast2400/smc/status_reg_write_protection",
873
- test_status_reg_write_protection);
874
- qtest_add_func("/ast2400/smc/write_block_protect",
875
- test_write_block_protect);
876
- qtest_add_func("/ast2400/smc/write_block_protect_bottom_bit",
877
- test_write_block_protect_bottom_bit);
878
-
879
- flash_reset();
880
- ret = g_test_run();
881
- qtest_quit(global_qtest);
882
- unlink(tmp_path);
883
-
884
- return ret;
885
+ data->s = qtest_initf("-m 256 -machine palmetto-bmc "
886
+ "-drive file=%s,format=raw,if=mtd",
887
+ data->tmp_path);
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
}
462
--
927
--
463
2.47.0
928
2.47.1
464
929
465
930
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
The interrupt status field is W1C, where a set bit on read indicates an
3
Currently, these test cases only support to test CE0. To test all CE pins,
4
interrupt is pending. If the bit extracted from data is set it should
4
introduces new ce and node members in TestData structure. The ce member is used
5
clear the corresponding bit in reg_value. However, if the extracted
5
for saving the ce index and node member is used for saving the node path,
6
bit is clear then the value of the corresponding bit in reg_value
6
respectively.
7
should be unchanged.
8
9
SHARED_FIELD_EX32() extracts the interrupt status bit from the write
10
(data). reg_value is set to the set's interrupt status, which means
11
that for any pin with an interrupt pending, the corresponding bit is
12
set. The deposit32() call updates the bit at pin_idx in the
13
reg_value, using the value extracted from the write (data).
14
15
The result is that if multiple interrupt status bits
16
were pending and the write was acknowledging specific one bit,
17
then the all interrupt status bits will be cleared.
18
However, it is index mode and should only clear the corresponding bit.
19
20
For example, say we have an interrupt pending for GPIOA0, where the
21
following statements are true:
22
23
set->int_status == 0b01
24
s->pending == 1
25
26
Before it is acknowledged, an interrupt becomes pending for GPIOA1:
27
28
set->int_status == 0b11
29
s->pending == 2
30
31
A write is issued to acknowledge the interrupt for GPIOA0. This causes
32
the following sequence:
33
34
reg_value == 0b11
35
pending == 2
36
s->pending == 0
37
set->int_status == 0b00
38
39
It should only clear bit 0 in index mode and the correct result
40
should be as following.
41
42
set->int_status == 0b11
43
s->pending == 2
44
45
pending == 1
46
s->pending == 1
47
set->int_status == 0b10
48
7
49
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
50
Suggested-by: Andrew Jeffery <andrew@codeconstruct.com.au>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
51
Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-4-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
52
---
12
---
53
hw/gpio/aspeed_gpio.c | 27 +++++++++++++++++----------
13
tests/qtest/aspeed_smc-test.c | 77 ++++++++++++++++++-----------------
54
1 file changed, 17 insertions(+), 10 deletions(-)
14
1 file changed, 40 insertions(+), 37 deletions(-)
55
15
56
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
57
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/gpio/aspeed_gpio.c
18
--- a/tests/qtest/aspeed_smc-test.c
59
+++ b/hw/gpio/aspeed_gpio.c
19
+++ b/tests/qtest/aspeed_smc-test.c
60
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
20
@@ -XXX,XX +XXX,XX @@
61
uint32_t pin_idx = reg_idx_number % ASPEED_GPIOS_PER_SET;
21
* ASPEED SPI Controller registers
62
uint32_t group_idx = pin_idx / GPIOS_PER_GROUP;
22
*/
63
uint32_t reg_value = 0;
23
#define R_CONF 0x00
64
- uint32_t cleared;
24
-#define CONF_ENABLE_W0 (1 << 16)
65
+ uint32_t pending = 0;
25
+#define CONF_ENABLE_W0 16
66
26
#define R_CE_CTRL 0x04
67
set = &s->sets[set_idx];
27
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
68
props = &agc->props[set_idx];
28
#define R_CTRL0 0x10
69
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_write_index_mode(void *opaque, hwaddr offset,
29
-#define CTRL_CE_STOP_ACTIVE (1 << 2)
70
FIELD_EX32(data, GPIO_INDEX_REG, INT_SENS_2));
30
+#define CTRL_CE_STOP_ACTIVE BIT(2)
71
set->int_sens_2 = update_value_control_source(set, set->int_sens_2,
31
#define CTRL_READMODE 0x0
72
reg_value);
32
#define CTRL_FREADMODE 0x1
73
- /* set interrupt status */
33
#define CTRL_WRITEMODE 0x2
74
- reg_value = set->int_status;
34
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
75
- reg_value = deposit32(reg_value, pin_idx, 1,
35
uint64_t flash_base;
76
- FIELD_EX32(data, GPIO_INDEX_REG, INT_STATUS));
36
uint32_t jedec_id;
77
- cleared = ctpop32(reg_value & set->int_status);
37
char *tmp_path;
78
- if (s->pending && cleared) {
38
+ uint8_t cs;
79
- assert(s->pending >= cleared);
39
+ const char *node;
80
- s->pending -= cleared;
40
} TestData;
81
+ /* interrupt status */
41
82
+ if (FIELD_EX32(data, GPIO_INDEX_REG, INT_STATUS)) {
42
/*
83
+ /* pending is either 1 or 0 for a 1-bit field */
43
@@ -XXX,XX +XXX,XX @@ static void spi_ce_ctrl(const TestData *data, uint32_t value)
84
+ pending = extract32(set->int_status, pin_idx, 1);
44
85
+
45
static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
86
+ assert(s->pending >= pending);
46
{
87
+
47
- uint32_t ctrl = spi_readl(data, R_CTRL0);
88
+ /* No change to s->pending if pending is 0 */
48
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
89
+ s->pending -= pending;
49
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
90
+
50
ctrl &= ~(CTRL_USERMODE | 0xff << 16);
91
+ /*
51
ctrl |= mode | (cmd << 16);
92
+ * The write acknowledged the interrupt regardless of whether it
52
- spi_writel(data, R_CTRL0, ctrl);
93
+ * was pending or not. The post-condition is that it mustn't be
53
+ spi_writel(data, ctrl_reg, ctrl);
94
+ * pending. Unconditionally clear the status bit.
54
}
95
+ */
55
96
+ set->int_status = deposit32(set->int_status, pin_idx, 1, 0);
56
static void spi_ctrl_start_user(const TestData *data)
97
}
57
{
98
- set->int_status &= ~reg_value;
58
- uint32_t ctrl = spi_readl(data, R_CTRL0);
99
break;
59
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
100
case gpio_reg_idx_debounce:
60
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
101
reg_value = set->debounce_1;
61
62
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
63
- spi_writel(data, R_CTRL0, ctrl);
64
+ spi_writel(data, ctrl_reg, ctrl);
65
66
ctrl &= ~CTRL_CE_STOP_ACTIVE;
67
- spi_writel(data, R_CTRL0, ctrl);
68
+ spi_writel(data, ctrl_reg, ctrl);
69
}
70
71
static void spi_ctrl_stop_user(const TestData *data)
72
{
73
- uint32_t ctrl = spi_readl(data, R_CTRL0);
74
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
75
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
76
77
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
78
- spi_writel(data, R_CTRL0, ctrl);
79
+ spi_writel(data, ctrl_reg, ctrl);
80
}
81
82
static void flash_reset(const TestData *data)
83
{
84
- spi_conf(data, CONF_ENABLE_W0);
85
+ spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
86
87
spi_ctrl_start_user(data);
88
flash_writeb(data, 0, RESET_ENABLE);
89
@@ -XXX,XX +XXX,XX @@ static void flash_reset(const TestData *data)
90
flash_writeb(data, 0, WRDI);
91
spi_ctrl_stop_user(data);
92
93
- spi_conf_remove(data, CONF_ENABLE_W0);
94
+ spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
95
}
96
97
static void test_read_jedec(const void *data)
98
@@ -XXX,XX +XXX,XX @@ static void test_read_jedec(const void *data)
99
const TestData *test_data = (const TestData *)data;
100
uint32_t jedec = 0x0;
101
102
- spi_conf(test_data, CONF_ENABLE_W0);
103
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
104
105
spi_ctrl_start_user(test_data);
106
flash_writeb(test_data, 0, JEDEC_READ);
107
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
108
uint32_t page[FLASH_PAGE_SIZE / 4];
109
int i;
110
111
- spi_conf(test_data, CONF_ENABLE_W0);
112
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
113
114
/*
115
* Previous page should be full of 0xffs after backend is
116
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
117
uint32_t page[FLASH_PAGE_SIZE / 4];
118
int i;
119
120
- spi_conf(test_data, CONF_ENABLE_W0);
121
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
122
123
/*
124
* Previous page should be full of 0xffs after backend is
125
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
126
uint32_t page[FLASH_PAGE_SIZE / 4];
127
int i;
128
129
- spi_conf(test_data, CONF_ENABLE_W0);
130
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
131
132
spi_ctrl_start_user(test_data);
133
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
134
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
135
int i;
136
137
/*
138
- * Enable 4BYTE mode for controller. This is should be strapped by
139
- * HW for CE0 anyhow.
140
+ * Enable 4BYTE mode for controller.
141
*/
142
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
143
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
144
145
/* Enable 4BYTE mode for flash. */
146
- spi_conf(test_data, CONF_ENABLE_W0);
147
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
148
spi_ctrl_start_user(test_data);
149
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
150
flash_writeb(test_data, 0, WREN);
151
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
152
flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
153
}
154
spi_ctrl_stop_user(test_data);
155
- spi_conf_remove(test_data, CONF_ENABLE_W0);
156
+ spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
157
158
/* Check what was written */
159
read_page_mem(test_data, my_page_addr, page);
160
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(const void *data)
161
int i;
162
163
/*
164
- * Enable 4BYTE mode for controller. This is should be strapped by
165
- * HW for CE0 anyhow.
166
+ * Enable 4BYTE mode for controller.
167
*/
168
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
169
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
170
171
/* Enable 4BYTE mode for flash. */
172
- spi_conf(test_data, CONF_ENABLE_W0);
173
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
174
spi_ctrl_start_user(test_data);
175
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
176
flash_writeb(test_data, 0, WREN);
177
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
178
const TestData *test_data = (const TestData *)data;
179
uint8_t r;
180
181
- spi_conf(test_data, CONF_ENABLE_W0);
182
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
183
184
spi_ctrl_start_user(test_data);
185
flash_writeb(test_data, 0, RDSR);
186
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
187
188
g_assert_cmphex(r & SR_WEL, ==, 0);
189
g_assert(!qtest_qom_get_bool
190
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
191
+ (test_data->s, test_data->node, "write-enable"));
192
193
spi_ctrl_start_user(test_data);
194
flash_writeb(test_data, 0, WREN);
195
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
196
197
g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
198
g_assert(qtest_qom_get_bool
199
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
200
+ (test_data->s, test_data->node, "write-enable"));
201
202
spi_ctrl_start_user(test_data);
203
flash_writeb(test_data, 0, WRDI);
204
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
205
206
g_assert_cmphex(r & SR_WEL, ==, 0);
207
g_assert(!qtest_qom_get_bool
208
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
209
+ (test_data->s, test_data->node, "write-enable"));
210
211
flash_reset(test_data);
212
}
213
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
214
const TestData *test_data = (const TestData *)data;
215
uint8_t r;
216
217
- spi_conf(test_data, CONF_ENABLE_W0);
218
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
219
220
/* default case: WP# is high and SRWD is low -> status register writable */
221
spi_ctrl_start_user(test_data);
222
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
223
g_assert_cmphex(r & SRWD, ==, 0);
224
225
/* WP# low and SRWD low -> status register writable */
226
- qtest_set_irq_in(test_data->s,
227
- "/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 0);
228
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
229
spi_ctrl_start_user(test_data);
230
flash_writeb(test_data, 0, WREN);
231
/* test ability to write SRWD */
232
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
233
/* write is not successful */
234
g_assert_cmphex(r & SRWD, ==, SRWD);
235
236
- qtest_set_irq_in(test_data->s,
237
- "/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 1);
238
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
239
flash_reset(test_data);
240
}
241
242
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect(const void *data)
243
uint32_t sector_size = 65536;
244
uint32_t n_sectors = 512;
245
246
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
247
- spi_conf(test_data, CONF_ENABLE_W0);
248
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
249
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
250
251
uint32_t bp_bits = 0b0;
252
253
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
254
uint32_t sector_size = 65536;
255
uint32_t n_sectors = 512;
256
257
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
258
- spi_conf(test_data, CONF_ENABLE_W0);
259
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
260
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
261
262
/* top bottom bit is enabled */
263
uint32_t bp_bits = 0b00100 << 3;
264
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
265
data->flash_base = 0x20000000;
266
data->spi_base = 0x1E620000;
267
data->jedec_id = 0x20ba19;
268
+ data->cs = 0;
269
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
270
271
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
272
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
102
--
273
--
103
2.47.0
274
2.47.1
275
276
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Fix coding style issues from checkpatch.pl
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.
4
9
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Thomas Huth <thuth@redhat.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.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>
8
---
14
---
9
tests/qtest/aspeed_smc-test.c | 6 ++++--
15
tests/qtest/aspeed_smc-test.c | 17 ++++++++++-------
10
1 file changed, 4 insertions(+), 2 deletions(-)
16
1 file changed, 10 insertions(+), 7 deletions(-)
11
17
12
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
18
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
13
index XXXXXXX..XXXXXXX 100644
19
index XXXXXXX..XXXXXXX 100644
14
--- a/tests/qtest/aspeed_smc-test.c
20
--- a/tests/qtest/aspeed_smc-test.c
15
+++ b/tests/qtest/aspeed_smc-test.c
21
+++ b/tests/qtest/aspeed_smc-test.c
16
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(void)
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;
17
uint32_t page[FLASH_PAGE_SIZE / 4];
36
uint32_t page[FLASH_PAGE_SIZE / 4];
18
int i;
37
int i;
19
38
20
- /* Enable 4BYTE mode for controller. This is should be strapped by
39
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
21
+ /*
40
static void test_erase_all(const void *data)
22
+ * Enable 4BYTE mode for controller. This is should be strapped by
41
{
23
* HW for CE0 anyhow.
42
const TestData *test_data = (const TestData *)data;
24
*/
43
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
25
spi_ce_ctrl(1 << CRTL_EXTENDED0);
44
+ uint32_t some_page_addr = test_data->page_addr;
26
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(void)
27
uint32_t page[FLASH_PAGE_SIZE / 4];
45
uint32_t page[FLASH_PAGE_SIZE / 4];
28
int i;
46
int i;
29
47
30
- /* Enable 4BYTE mode for controller. This is should be strapped by
48
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
31
+ /*
49
static void test_write_page(const void *data)
32
+ * Enable 4BYTE mode for controller. This is should be strapped by
50
{
33
* HW for CE0 anyhow.
51
const TestData *test_data = (const TestData *)data;
34
*/
52
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
35
spi_ce_ctrl(1 << CRTL_EXTENDED0);
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);
36
--
88
--
37
2.47.0
89
2.47.1
38
90
39
91
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
According to the design of ASPEED SPI controllers user mode, users write the
3
Add test_ast2500_evb function and reused testcases for AST2500 testing.
4
data to flash, the SPI drivers set the Control Register(0x10) bit 0 and 1
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
enter user mode. Then, SPI drivers send flash commands for writing data.
5
0x1E620000, 0x20000000 and 0, respectively.
6
Finally, SPI drivers set the Control Register (0x10) bit 2 to stop
6
The default flash model of fmc_cs0 is "mx25l25635e" whose size is 32MB,
7
active control and restore bit 0 and 1.
7
so set jedec_id 0xc22019.
8
9
According to the design of ASPEED SMC model, firmware writes the
10
Control Register and the "aspeed_smc_flash_update_ctrl" function is called.
11
Then, this function verify Control Register(0x10) bit 0 and 1. If it set user
12
mode, the value of s->snoop_index is SNOOP_START else SNOOP_OFF.
13
If s->snoop_index is SNOOP_START, the "aspeed_smc_do_snoop" function verify
14
the first incomming data is a new flash command and writes the corresponding
15
dummy bytes if need.
16
17
However, it did not check the current unselect status. If current unselect
18
status is "false" and firmware set the IO MODE by Control Register bit 31:28,
19
the value of s->snoop_index will be changed to SNOOP_START again and
20
"aspeed_smc_do_snoop" misunderstand that the incomming data is the new flash
21
command and it causes writing unexpected data into flash.
22
23
Example:
24
1. Firmware set user mode by Control Register bit 0 and 1(0x03)
25
2. SMC model set s->snoop SNOOP_START
26
3. Firmware set Quad Page Program with 4-Byte Address command (0x34)
27
4. SMC model verify this flash command and it needs 4 dummy bytes.
28
5. Firmware send 4 bytes address.
29
6. SMC model receives 4 bytes address
30
7. Firmware set QPI IO MODE by Control Register bit 31. (0x80000003)
31
8. SMC model verify new user mode by Control Register bit 0 and 1.
32
Then, set s->snoop SNOOP_START again. (It is the wrong behavior.)
33
9. Firmware send 0xebd8c134 data and it should be written into flash.
34
However, SMC model misunderstand that the first incoming data, 0x34,
35
is the new command because the value of s->snoop is changed to SNOOP_START.
36
Finally, SMC sned the incorrect data to flash model.
37
38
Introduce a new unselect attribute in AspeedSMCState to save the current
39
unselect status for user mode and set it "true" by default.
40
Update "aspeed_smc_flash_update_ctrl" function to check the previous unselect
41
status. If both new unselect status and previous unselect status is different,
42
update s->snoop_index value and call "aspeed_smc_flash_do_select".
43
44
Increase VMStateDescription version.
45
8
46
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
47
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
48
[ clg: - Replaced VMSTATE_BOOL -> VMSTATE_BOOL_V ]
11
Link: https://lore.kernel.org/r/20241127091543.1243114-6-jamin_lin@aspeedtech.com
49
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
50
---
13
---
51
include/hw/ssi/aspeed_smc.h | 1 +
14
tests/qtest/aspeed_smc-test.c | 40 +++++++++++++++++++++++++++++++++++
52
hw/ssi/aspeed_smc.c | 40 ++++++++++++++++++++++++++-----------
15
1 file changed, 40 insertions(+)
53
2 files changed, 29 insertions(+), 12 deletions(-)
54
16
55
diff --git a/include/hw/ssi/aspeed_smc.h b/include/hw/ssi/aspeed_smc.h
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
56
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
57
--- a/include/hw/ssi/aspeed_smc.h
19
--- a/tests/qtest/aspeed_smc-test.c
58
+++ b/include/hw/ssi/aspeed_smc.h
20
+++ b/tests/qtest/aspeed_smc-test.c
59
@@ -XXX,XX +XXX,XX @@ struct AspeedSMCState {
21
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
60
22
data, test_write_block_protect_bottom_bit);
61
uint8_t snoop_index;
62
uint8_t snoop_dummies;
63
+ bool unselect;
64
};
65
66
typedef struct AspeedSegments {
67
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
68
index XXXXXXX..XXXXXXX 100644
69
--- a/hw/ssi/aspeed_smc.c
70
+++ b/hw/ssi/aspeed_smc.c
71
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_flash_do_select(AspeedSMCFlash *fl, bool unselect)
72
AspeedSMCState *s = fl->controller;
73
74
trace_aspeed_smc_flash_select(fl->cs, unselect ? "un" : "");
75
-
76
+ s->unselect = unselect;
77
qemu_set_irq(s->cs_lines[fl->cs], unselect);
78
}
23
}
79
24
80
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_smc_flash_ops = {
25
+static void test_ast2500_evb(TestData *data)
81
static void aspeed_smc_flash_update_ctrl(AspeedSMCFlash *fl, uint32_t value)
26
+{
27
+ int ret;
28
+ int fd;
29
+
30
+ fd = g_file_open_tmp("qtest.m25p80.mx25l25635e.XXXXXX",
31
+ &data->tmp_path, NULL);
32
+ g_assert(fd >= 0);
33
+ ret = ftruncate(fd, 32 * 1024 * 1024);
34
+ g_assert(ret == 0);
35
+ close(fd);
36
+
37
+ data->s = qtest_initf("-machine ast2500-evb "
38
+ "-drive file=%s,format=raw,if=mtd",
39
+ data->tmp_path);
40
+
41
+ /* fmc cs0 with mx25l25635e flash */
42
+ data->flash_base = 0x20000000;
43
+ data->spi_base = 0x1E620000;
44
+ data->jedec_id = 0xc22019;
45
+ data->cs = 0;
46
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
47
+ /* beyond 16MB */
48
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
49
+
50
+ qtest_add_data_func("/ast2500/smc/read_jedec", data, test_read_jedec);
51
+ qtest_add_data_func("/ast2500/smc/erase_sector", data, test_erase_sector);
52
+ qtest_add_data_func("/ast2500/smc/erase_all", data, test_erase_all);
53
+ qtest_add_data_func("/ast2500/smc/write_page", data, test_write_page);
54
+ qtest_add_data_func("/ast2500/smc/read_page_mem",
55
+ data, test_read_page_mem);
56
+ qtest_add_data_func("/ast2500/smc/write_page_mem",
57
+ data, test_write_page_mem);
58
+ qtest_add_data_func("/ast2500/smc/read_status_reg",
59
+ data, test_read_status_reg);
60
+}
61
int main(int argc, char **argv)
82
{
62
{
83
AspeedSMCState *s = fl->controller;
63
TestData palmetto_data;
84
- bool unselect;
64
+ TestData ast2500_evb_data;
85
+ bool unselect = false;
65
int ret;
86
+ uint32_t old_mode;
66
87
+ uint32_t new_mode;
67
g_test_init(&argc, &argv, NULL);
88
+
68
89
+ old_mode = s->regs[s->r_ctrl0 + fl->cs] & CTRL_CMD_MODE_MASK;
69
test_palmetto_bmc(&palmetto_data);
90
+ new_mode = value & CTRL_CMD_MODE_MASK;
70
+ test_ast2500_evb(&ast2500_evb_data);
91
71
ret = g_test_run();
92
- /* User mode selects the CS, other modes unselect */
72
93
- unselect = (value & CTRL_CMD_MODE_MASK) != CTRL_USERMODE;
73
qtest_quit(palmetto_data.s);
94
+ if (old_mode == CTRL_USERMODE) {
74
+ qtest_quit(ast2500_evb_data.s);
95
+ if (new_mode != CTRL_USERMODE) {
75
unlink(palmetto_data.tmp_path);
96
+ unselect = true;
76
+ unlink(ast2500_evb_data.tmp_path);
97
+ }
77
return ret;
98
99
- /* A change of CTRL_CE_STOP_ACTIVE from 0 to 1, unselects the CS */
100
- if (!(s->regs[s->r_ctrl0 + fl->cs] & CTRL_CE_STOP_ACTIVE) &&
101
- value & CTRL_CE_STOP_ACTIVE) {
102
- unselect = true;
103
+ /* A change of CTRL_CE_STOP_ACTIVE from 0 to 1, unselects the CS */
104
+ if (!(s->regs[s->r_ctrl0 + fl->cs] & CTRL_CE_STOP_ACTIVE) &&
105
+ value & CTRL_CE_STOP_ACTIVE) {
106
+ unselect = true;
107
+ }
108
+ } else {
109
+ if (new_mode != CTRL_USERMODE) {
110
+ unselect = true;
111
+ }
112
}
113
114
s->regs[s->r_ctrl0 + fl->cs] = value;
115
116
- s->snoop_index = unselect ? SNOOP_OFF : SNOOP_START;
117
-
118
- aspeed_smc_flash_do_select(fl, unselect);
119
+ if (unselect != s->unselect) {
120
+ s->snoop_index = unselect ? SNOOP_OFF : SNOOP_START;
121
+ aspeed_smc_flash_do_select(fl, unselect);
122
+ }
123
}
78
}
124
125
static void aspeed_smc_reset(DeviceState *d)
126
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_reset(DeviceState *d)
127
qemu_set_irq(s->cs_lines[i], true);
128
}
129
130
+ s->unselect = true;
131
+
132
/* setup the default segment register values and regions for all */
133
for (i = 0; i < asc->cs_num_max; ++i) {
134
aspeed_smc_flash_set_segment_region(s, i,
135
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_realize(DeviceState *dev, Error **errp)
136
137
static const VMStateDescription vmstate_aspeed_smc = {
138
.name = "aspeed.smc",
139
- .version_id = 2,
140
+ .version_id = 3,
141
.minimum_version_id = 2,
142
.fields = (const VMStateField[]) {
143
VMSTATE_UINT32_ARRAY(regs, AspeedSMCState, ASPEED_SMC_R_MAX),
144
VMSTATE_UINT8(snoop_index, AspeedSMCState),
145
VMSTATE_UINT8(snoop_dummies, AspeedSMCState),
146
+ VMSTATE_BOOL_V(unselect, AspeedSMCState, 3),
147
VMSTATE_END_OF_LIST()
148
}
149
};
150
--
79
--
151
2.47.0
80
2.47.1
152
81
153
82
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
According to the w25q01jv datasheet at page 16, it is required to set QE bit
3
Add test_ast2600_evb function and reused testcases for AST2600 testing.
4
in "Status Register 2" to enable quad mode.
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
5
0x1E620000, 0x20000000 and 0, respectively.
6
Currently, m25p80 support users utilize "Write Status Register 1(0x01)" command
6
The default flash model of fmc_cs0 is "mx66u51235f" whose size is 64MB,
7
to set QE bit in "Status Register 2" and utilize "Read Status Register 2(0x35)"
7
so set jedec_id 0xc2253a.
8
command to get the QE bit status.
9
10
However, some firmware directly utilize "Status Register 2(0x31)" command to
11
set QE bit. To fully support quad mode for w25q01jvq, adds WRSR2 command.
12
13
Update collecting data needed 1 byte for WRSR2 command in decode_new_cmd
14
function and verify QE bit at the first byte of collecting data bit 2 in
15
complete_collecting_data.
16
8
17
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
18
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-7-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
19
---
13
---
20
hw/block/m25p80.c | 38 ++++++++++++++++++++++++++++++++++++++
14
tests/qtest/aspeed_smc-test.c | 41 +++++++++++++++++++++++++++++++++++
21
1 file changed, 38 insertions(+)
15
1 file changed, 41 insertions(+)
22
16
23
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
24
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
25
--- a/hw/block/m25p80.c
19
--- a/tests/qtest/aspeed_smc-test.c
26
+++ b/hw/block/m25p80.c
20
+++ b/tests/qtest/aspeed_smc-test.c
27
@@ -XXX,XX +XXX,XX @@ typedef enum {
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
28
RDCR_EQIO = 0x35,
22
qtest_add_data_func("/ast2500/smc/read_status_reg",
29
RSTQIO = 0xf5,
23
data, test_read_status_reg);
30
24
}
31
+ /*
32
+ * Winbond: 0x31 - write status register 2
33
+ */
34
+ WRSR2 = 0x31,
35
+
25
+
36
RNVCR = 0xB5,
26
+static void test_ast2600_evb(TestData *data)
37
WNVCR = 0xB1,
27
+{
38
28
+ int ret;
39
@@ -XXX,XX +XXX,XX @@ static void complete_collecting_data(Flash *s)
29
+ int fd;
40
s->write_enable = false;
30
+
41
}
31
+ fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
42
break;
32
+ &data->tmp_path, NULL);
43
+ case WRSR2:
33
+ g_assert(fd >= 0);
44
+ switch (get_man(s)) {
34
+ ret = ftruncate(fd, 64 * 1024 * 1024);
45
+ case MAN_WINBOND:
35
+ g_assert(ret == 0);
46
+ s->quad_enable = !!(s->data[0] & 0x02);
36
+ close(fd);
47
+ break;
37
+
48
+ default:
38
+ data->s = qtest_initf("-machine ast2600-evb "
49
+ break;
39
+ "-drive file=%s,format=raw,if=mtd",
50
+ }
40
+ data->tmp_path);
51
+ break;
41
+
52
case BRWR:
42
+ /* fmc cs0 with mx66u51235f flash */
53
case EXTEND_ADDR_WRITE:
43
+ data->flash_base = 0x20000000;
54
s->ear = s->data[0];
44
+ data->spi_base = 0x1E620000;
55
@@ -XXX,XX +XXX,XX @@ static void decode_new_cmd(Flash *s, uint32_t value)
45
+ data->jedec_id = 0xc2253a;
56
}
46
+ data->cs = 0;
57
s->pos = 0;
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
58
break;
48
+ /* beyond 16MB */
59
+ case WRSR2:
49
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
60
+ /*
50
+
61
+ * If WP# is low and status_register_write_disabled is high,
51
+ qtest_add_data_func("/ast2600/smc/read_jedec", data, test_read_jedec);
62
+ * status register writes are disabled.
52
+ qtest_add_data_func("/ast2600/smc/erase_sector", data, test_erase_sector);
63
+ * This is also called "hardware protected mode" (HPM). All other
53
+ qtest_add_data_func("/ast2600/smc/erase_all", data, test_erase_all);
64
+ * combinations of the two states are called "software protected mode"
54
+ qtest_add_data_func("/ast2600/smc/write_page", data, test_write_page);
65
+ * (SPM), and status register writes are permitted.
55
+ qtest_add_data_func("/ast2600/smc/read_page_mem",
66
+ */
56
+ data, test_read_page_mem);
67
+ if ((s->wp_level == 0 && s->status_register_write_disabled)
57
+ qtest_add_data_func("/ast2600/smc/write_page_mem",
68
+ || !s->write_enable) {
58
+ data, test_write_page_mem);
69
+ qemu_log_mask(LOG_GUEST_ERROR,
59
+ qtest_add_data_func("/ast2600/smc/read_status_reg",
70
+ "M25P80: Status register 2 write is disabled!\n");
60
+ data, test_read_status_reg);
71
+ break;
61
+}
72
+ }
62
int main(int argc, char **argv)
73
63
{
74
+ switch (get_man(s)) {
64
TestData palmetto_data;
75
+ case MAN_WINBOND:
65
TestData ast2500_evb_data;
76
+ s->needed_bytes = 1;
66
+ TestData ast2600_evb_data;
77
+ s->state = STATE_COLLECTING_DATA;
67
int ret;
78
+ s->pos = 0;
68
79
+ break;
69
g_test_init(&argc, &argv, NULL);
80
+ default:
70
81
+ break;
71
test_palmetto_bmc(&palmetto_data);
82
+ }
72
test_ast2500_evb(&ast2500_evb_data);
83
+ break;
73
+ test_ast2600_evb(&ast2600_evb_data);
84
case WRDI:
74
ret = g_test_run();
85
s->write_enable = false;
75
86
if (get_man(s) == MAN_SST) {
76
qtest_quit(palmetto_data.s);
77
qtest_quit(ast2500_evb_data.s);
78
+ qtest_quit(ast2600_evb_data.s);
79
unlink(palmetto_data.tmp_path);
80
unlink(ast2500_evb_data.tmp_path);
81
+ unlink(ast2600_evb_data.tmp_path);
82
return ret;
83
}
87
--
84
--
88
2.47.0
85
2.47.1
89
86
90
87
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Fix coding style issues from checkpatch.pl
3
Add test_ast1030_evb function and reused testcases for AST1030 testing.
4
The base address, flash base address and ce index of fmc_cs0 are
5
0x7E620000, 0x80000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "w25q80bl" whose size is 1MB,
7
so set jedec_id 0xef4014.
4
8
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-8-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
13
---
8
hw/block/m25p80.c | 22 ++++++++++++++--------
14
tests/qtest/aspeed_smc-test.c | 42 +++++++++++++++++++++++++++++++++++
9
1 file changed, 14 insertions(+), 8 deletions(-)
15
1 file changed, 42 insertions(+)
10
16
11
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
12
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/block/m25p80.c
19
--- a/tests/qtest/aspeed_smc-test.c
14
+++ b/hw/block/m25p80.c
20
+++ b/tests/qtest/aspeed_smc-test.c
15
@@ -XXX,XX +XXX,XX @@ typedef struct FlashPartInfo {
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
16
*/
22
qtest_add_data_func("/ast2600/smc/read_status_reg",
17
uint8_t id[SPI_NOR_MAX_ID_LEN];
23
data, test_read_status_reg);
18
uint8_t id_len;
19
- /* there is confusion between manufacturers as to what a sector is. In this
20
+ /*
21
+ * there is confusion between manufacturers as to what a sector is. In this
22
* device model, a "sector" is the size that is erased by the ERASE_SECTOR
23
* command (opcode 0xd8).
24
*/
25
@@ -XXX,XX +XXX,XX @@ typedef struct FlashPartInfo {
26
/*
27
* Spansion read mode command length in bytes,
28
* the mode is currently not supported.
29
-*/
30
+ */
31
32
#define SPANSION_CONTINUOUS_READ_MODE_CMD_LEN 1
33
#define WINBOND_CONTINUOUS_READ_MODE_CMD_LEN 1
34
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
35
36
{ INFO("at45db081d", 0x1f2500, 0, 64 << 10, 16, ER_4K) },
37
38
- /* Atmel EEPROMS - it is assumed, that don't care bit in command
39
+ /*
40
+ * Atmel EEPROMS - it is assumed, that don't care bit in command
41
* is set to 0. Block protection is not supported.
42
*/
43
{ INFO("at25128a-nonjedec", 0x0, 0, 1, 131072, EEPROM) },
44
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
45
{ INFO_STACKED("n25q00a", 0x20bb21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
46
{ INFO_STACKED("mt25ql01g", 0x20ba21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
47
{ INFO_STACKED("mt25qu01g", 0x20bb21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
48
- { INFO_STACKED("mt25ql02g", 0x20ba22, 0x1040, 64 << 10, 4096, ER_4K | ER_32K, 2) },
49
- { INFO_STACKED("mt25qu02g", 0x20bb22, 0x1040, 64 << 10, 4096, ER_4K | ER_32K, 2) },
50
+ { INFO_STACKED("mt25ql02g", 0x20ba22, 0x1040, 64 << 10, 4096,
51
+ ER_4K | ER_32K, 2) },
52
+ { INFO_STACKED("mt25qu02g", 0x20bb22, 0x1040, 64 << 10, 4096,
53
+ ER_4K | ER_32K, 2) },
54
55
- /* Spansion -- single (large) sector size only, at least
56
+ /*
57
+ * Spansion -- single (large) sector size only, at least
58
* for the chips listed here (without boot sectors).
59
*/
60
{ INFO("s25sl032p", 0x010215, 0x4d00, 64 << 10, 64, ER_4K) },
61
@@ -XXX,XX +XXX,XX @@ static void blk_sync_complete(void *opaque, int ret)
62
qemu_iovec_destroy(iov);
63
g_free(iov);
64
65
- /* do nothing. Masters do not directly interact with the backing store,
66
+ /*
67
+ * do nothing. Masters do not directly interact with the backing store,
68
* only the working copy so no mutexing required.
69
*/
70
}
24
}
71
@@ -XXX,XX +XXX,XX @@ static void m25p80_register_types(void)
25
+
72
26
+static void test_ast1030_evb(TestData *data)
73
type_register_static(&m25p80_info);
27
+{
74
for (i = 0; i < ARRAY_SIZE(known_devices); ++i) {
28
+ int ret;
75
- TypeInfo ti = {
29
+ int fd;
76
+ const TypeInfo ti = {
30
+
77
.name = known_devices[i].part_name,
31
+ fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
78
.parent = TYPE_M25P80,
32
+ &data->tmp_path, NULL);
79
.class_init = m25p80_class_init,
33
+ g_assert(fd >= 0);
34
+ ret = ftruncate(fd, 1 * 1024 * 1024);
35
+ g_assert(ret == 0);
36
+ close(fd);
37
+
38
+ data->s = qtest_initf("-machine ast1030-evb "
39
+ "-drive file=%s,format=raw,if=mtd",
40
+ data->tmp_path);
41
+
42
+ /* fmc cs0 with w25q80bl flash */
43
+ data->flash_base = 0x80000000;
44
+ data->spi_base = 0x7E620000;
45
+ data->jedec_id = 0xef4014;
46
+ data->cs = 0;
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
48
+ /* beyond 512KB */
49
+ data->page_addr = 0x800 * FLASH_PAGE_SIZE;
50
+
51
+ qtest_add_data_func("/ast1030/smc/read_jedec", data, test_read_jedec);
52
+ qtest_add_data_func("/ast1030/smc/erase_sector", data, test_erase_sector);
53
+ qtest_add_data_func("/ast1030/smc/erase_all", data, test_erase_all);
54
+ qtest_add_data_func("/ast1030/smc/write_page", data, test_write_page);
55
+ qtest_add_data_func("/ast1030/smc/read_page_mem",
56
+ data, test_read_page_mem);
57
+ qtest_add_data_func("/ast1030/smc/write_page_mem",
58
+ data, test_write_page_mem);
59
+ qtest_add_data_func("/ast1030/smc/read_status_reg",
60
+ data, test_read_status_reg);
61
+}
62
+
63
int main(int argc, char **argv)
64
{
65
TestData palmetto_data;
66
TestData ast2500_evb_data;
67
TestData ast2600_evb_data;
68
+ TestData ast1030_evb_data;
69
int ret;
70
71
g_test_init(&argc, &argv, NULL);
72
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
73
test_palmetto_bmc(&palmetto_data);
74
test_ast2500_evb(&ast2500_evb_data);
75
test_ast2600_evb(&ast2600_evb_data);
76
+ test_ast1030_evb(&ast1030_evb_data);
77
ret = g_test_run();
78
79
qtest_quit(palmetto_data.s);
80
qtest_quit(ast2500_evb_data.s);
81
qtest_quit(ast2600_evb_data.s);
82
+ qtest_quit(ast1030_evb_data.s);
83
unlink(palmetto_data.tmp_path);
84
unlink(ast2500_evb_data.tmp_path);
85
unlink(ast2600_evb_data.tmp_path);
86
+ unlink(ast1030_evb_data.tmp_path);
87
return ret;
88
}
80
--
89
--
81
2.47.0
90
2.47.1
82
91
83
92
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
It set "aspeed_gpio_ops" struct which containing read and write callbacks
3
Add a new testcase for write page command with QPI mode testing.
4
to be used when I/O is performed on the GPIO region.
4
Currently, only run this testcase for AST2500, AST2600 and AST1030.
5
6
Besides, in the previous design of ASPEED SOCs, one register is used for
7
setting one function for 32 GPIO pins.
8
ex: GPIO000 is used for setting data value for GPIO A, B, C and D in AST2600.
9
ex: GPIO004 is used for setting direction for GPIO A, B, C and D in AST2600.
10
11
However, the register set have a significant change in AST2700.
12
Each GPIO pin has their own control register. In other words, users are able to
13
set one GPIO pin’s direction, interrupt enable, input mask and so on
14
in one register. The aspeed_gpio_read/aspeed_gpio_write callback functions
15
are not compatible AST2700.
16
17
Introduce a new "const MemoryRegionOps *" attribute in AspeedGPIOClass and
18
use it in aspeed_gpio_realize function.
19
5
20
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
21
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
8
Link: https://lore.kernel.org/r/20241127091543.1243114-9-jamin_lin@aspeedtech.com
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
22
---
10
---
23
include/hw/gpio/aspeed_gpio.h | 1 +
11
tests/qtest/aspeed_smc-test.c | 74 +++++++++++++++++++++++++++++++++++
24
hw/gpio/aspeed_gpio.c | 7 ++++++-
12
1 file changed, 74 insertions(+)
25
2 files changed, 7 insertions(+), 1 deletion(-)
26
13
27
diff --git a/include/hw/gpio/aspeed_gpio.h b/include/hw/gpio/aspeed_gpio.h
14
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
28
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/gpio/aspeed_gpio.h
16
--- a/tests/qtest/aspeed_smc-test.c
30
+++ b/include/hw/gpio/aspeed_gpio.h
17
+++ b/tests/qtest/aspeed_smc-test.c
31
@@ -XXX,XX +XXX,XX @@ struct AspeedGPIOClass {
18
@@ -XXX,XX +XXX,XX @@
32
const AspeedGPIOReg *reg_table;
19
#define R_CE_CTRL 0x04
33
unsigned reg_table_count;
20
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
34
uint64_t mem_size;
21
#define R_CTRL0 0x10
35
+ const MemoryRegionOps *reg_ops;
22
+#define CTRL_IO_QUAD_IO BIT(31)
23
#define CTRL_CE_STOP_ACTIVE BIT(2)
24
#define CTRL_READMODE 0x0
25
#define CTRL_FREADMODE 0x1
26
@@ -XXX,XX +XXX,XX @@ enum {
27
ERASE_SECTOR = 0xd8,
36
};
28
};
37
29
38
struct AspeedGPIOState {
30
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
39
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
31
#define FLASH_PAGE_SIZE 256
40
index XXXXXXX..XXXXXXX 100644
32
41
--- a/hw/gpio/aspeed_gpio.c
33
typedef struct TestData {
42
+++ b/hw/gpio/aspeed_gpio.c
34
@@ -XXX,XX +XXX,XX @@ static void spi_ctrl_stop_user(const TestData *data)
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_realize(DeviceState *dev, Error **errp)
35
spi_writel(data, ctrl_reg, ctrl);
44
}
45
}
46
47
- memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_gpio_ops, s,
48
+ memory_region_init_io(&s->iomem, OBJECT(s), agc->reg_ops, s,
49
TYPE_ASPEED_GPIO, agc->mem_size);
50
51
sysbus_init_mmio(sbd, &s->iomem);
52
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_ast2400_class_init(ObjectClass *klass, void *data)
53
agc->reg_table = aspeed_3_3v_gpios;
54
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
55
agc->mem_size = 0x1000;
56
+ agc->reg_ops = &aspeed_gpio_ops;
57
}
36
}
58
37
59
static void aspeed_gpio_2500_class_init(ObjectClass *klass, void *data)
38
+static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
60
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_2500_class_init(ObjectClass *klass, void *data)
39
+{
61
agc->reg_table = aspeed_3_3v_gpios;
40
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
62
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
41
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
63
agc->mem_size = 0x1000;
42
+ uint32_t mode;
64
+ agc->reg_ops = &aspeed_gpio_ops;
43
+
44
+ mode = value & CTRL_IO_MODE_MASK;
45
+ ctrl &= ~CTRL_IO_MODE_MASK;
46
+ ctrl |= mode;
47
+ spi_writel(data, ctrl_reg, ctrl);
48
+}
49
+
50
static void flash_reset(const TestData *data)
51
{
52
spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
53
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
54
flash_reset(test_data);
65
}
55
}
66
56
67
static void aspeed_gpio_ast2600_3_3v_class_init(ObjectClass *klass, void *data)
57
+static void test_write_page_qpi(const void *data)
68
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_ast2600_3_3v_class_init(ObjectClass *klass, void *data)
58
+{
69
agc->reg_table = aspeed_3_3v_gpios;
59
+ const TestData *test_data = (const TestData *)data;
70
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
60
+ uint32_t my_page_addr = test_data->page_addr;
71
agc->mem_size = 0x800;
61
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
72
+ agc->reg_ops = &aspeed_gpio_ops;
62
+ uint32_t page[FLASH_PAGE_SIZE / 4];
63
+ uint32_t page_pattern[] = {
64
+ 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
65
+ };
66
+ int i;
67
+
68
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
69
+
70
+ spi_ctrl_start_user(test_data);
71
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
72
+ flash_writeb(test_data, 0, WREN);
73
+ flash_writeb(test_data, 0, PP);
74
+ flash_writel(test_data, 0, make_be32(my_page_addr));
75
+
76
+ /* Set QPI mode */
77
+ spi_ctrl_set_io_mode(test_data, CTRL_IO_QUAD_IO);
78
+
79
+ /* Fill the page pattern */
80
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
81
+ flash_writel(test_data, 0, make_be32(page_pattern[i]));
82
+ }
83
+
84
+ /* Fill the page with its own addresses */
85
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
86
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
87
+ }
88
+
89
+ /* Restore io mode */
90
+ spi_ctrl_set_io_mode(test_data, 0);
91
+ spi_ctrl_stop_user(test_data);
92
+
93
+ /* Check what was written */
94
+ read_page(test_data, my_page_addr, page);
95
+ for (i = 0; i < ARRAY_SIZE(page_pattern); i++) {
96
+ g_assert_cmphex(page[i], ==, page_pattern[i]);
97
+ }
98
+ for (; i < FLASH_PAGE_SIZE / 4; i++) {
99
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
100
+ }
101
+
102
+ /* Check some other page. It should be full of 0xff */
103
+ read_page(test_data, some_page_addr, page);
104
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
105
+ g_assert_cmphex(page[i], ==, 0xffffffff);
106
+ }
107
+
108
+ flash_reset(test_data);
109
+}
110
+
111
static void test_palmetto_bmc(TestData *data)
112
{
113
int ret;
114
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
115
data, test_write_page_mem);
116
qtest_add_data_func("/ast2500/smc/read_status_reg",
117
data, test_read_status_reg);
118
+ qtest_add_data_func("/ast2500/smc/write_page_qpi",
119
+ data, test_write_page_qpi);
73
}
120
}
74
121
75
static void aspeed_gpio_ast2600_1_8v_class_init(ObjectClass *klass, void *data)
122
static void test_ast2600_evb(TestData *data)
76
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_ast2600_1_8v_class_init(ObjectClass *klass, void *data)
123
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
77
agc->reg_table = aspeed_1_8v_gpios;
124
data, test_write_page_mem);
78
agc->reg_table_count = GPIO_1_8V_REG_ARRAY_SIZE;
125
qtest_add_data_func("/ast2600/smc/read_status_reg",
79
agc->mem_size = 0x800;
126
data, test_read_status_reg);
80
+ agc->reg_ops = &aspeed_gpio_ops;
127
+ qtest_add_data_func("/ast2600/smc/write_page_qpi",
128
+ data, test_write_page_qpi);
81
}
129
}
82
130
83
static void aspeed_gpio_1030_class_init(ObjectClass *klass, void *data)
131
static void test_ast1030_evb(TestData *data)
84
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_1030_class_init(ObjectClass *klass, void *data)
132
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
85
agc->reg_table = aspeed_3_3v_gpios;
133
data, test_write_page_mem);
86
agc->reg_table_count = GPIO_3_3V_REG_ARRAY_SIZE;
134
qtest_add_data_func("/ast1030/smc/read_status_reg",
87
agc->mem_size = 0x1000;
135
data, test_read_status_reg);
88
+ agc->reg_ops = &aspeed_gpio_ops;
136
+ qtest_add_data_func("/ast1030/smc/write_page_qpi",
137
+ data, test_write_page_qpi);
89
}
138
}
90
139
91
static const TypeInfo aspeed_gpio_info = {
140
int main(int argc, char **argv)
92
--
141
--
93
2.47.0
142
2.47.1
94
143
95
144
diff view generated by jsdifflib
1
From: Alejandro Zeise <alejandro.zeise@seagate.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Make the Aspeed HACE module use the new qcrypto accumulative hashing functions
3
The testcases for ASPEED SMC model were placed in aspeed_smc-test.c.
4
when in scatter-gather accumulative mode. A hash context will maintain a
4
However, this test file only supports for ARM32. To support all ASPEED SOCs
5
"running-hash" as each scatter-gather chunk is received.
5
such as AST2700 whose CPU architecture is aarch64, introduces a new
6
aspeed-smc-utils source file and move all common APIs and testcases
7
from aspeed_smc-test.c to aspeed-smc-utils.c.
6
8
7
Previously each scatter-gather "chunk" was cached
9
Finally, users are able to re-used these testcase for AST2700 and future
8
so the hash could be computed once the final chunk was received.
10
ASPEED SOCs testing.
9
However, the cache was a shallow copy, so once the guest overwrote the
10
memory provided to HACE the final hash would not be correct.
11
11
12
Possibly related to: https://gitlab.com/qemu-project/qemu/-/issues/1121
12
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
13
Buglink: https://github.com/openbmc/qemu/issues/36
13
Reviewed-by: Cédric Le Goater <clg@redhat.com>
14
Link: https://lore.kernel.org/r/20241127091543.1243114-10-jamin_lin@aspeedtech.com
15
Signed-off-by: Cédric Le Goater <clg@redhat.com>
16
---
17
tests/qtest/aspeed-smc-utils.h | 95 ++++
18
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++++++
19
tests/qtest/aspeed_smc-test.c | 800 +++------------------------------
20
tests/qtest/meson.build | 1 +
21
4 files changed, 841 insertions(+), 741 deletions(-)
22
create mode 100644 tests/qtest/aspeed-smc-utils.h
23
create mode 100644 tests/qtest/aspeed-smc-utils.c
14
24
15
Signed-off-by: Alejandro Zeise <alejandro.zeise@seagate.com>
25
diff --git a/tests/qtest/aspeed-smc-utils.h b/tests/qtest/aspeed-smc-utils.h
16
[ clg: - Checkpatch fixes
26
new file mode 100644
17
- Reworked qcrypto_hash*() error reports in do_hash_operation() ]
27
index XXXXXXX..XXXXXXX
18
Signed-off-by: Cédric Le Goater <clg@redhat.com>
28
--- /dev/null
19
Acked-by: Andrew Jeffery <andrew@codeconstruct.com.au>
29
+++ b/tests/qtest/aspeed-smc-utils.h
20
Reviewed-by: Jamin Lin <jamin_lin@aspeedtech.com>
30
@@ -XXX,XX +XXX,XX @@
21
Reviewed-by: Joel Stanley <joel@jms.id.au>
31
+/*
22
---
32
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
23
include/hw/misc/aspeed_hace.h | 4 ++
33
+ * Controller)
24
hw/misc/aspeed_hace.c | 104 +++++++++++++++++++---------------
34
+ *
25
2 files changed, 63 insertions(+), 45 deletions(-)
35
+ * Copyright (C) 2016 IBM Corp.
26
36
+ *
27
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
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
+ */
55
+
56
+#ifndef TESTS_ASPEED_SMC_UTILS_H
57
+#define TESTS_ASPEED_SMC_UTILS_H
58
+
59
+#include "qemu/osdep.h"
60
+#include "qemu/bswap.h"
61
+#include "libqtest-single.h"
62
+#include "qemu/bitops.h"
63
+
64
+/*
65
+ * ASPEED SPI Controller registers
66
+ */
67
+#define R_CONF 0x00
68
+#define CONF_ENABLE_W0 16
69
+#define R_CE_CTRL 0x04
70
+#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
71
+#define R_CTRL0 0x10
72
+#define CTRL_IO_QUAD_IO BIT(31)
73
+#define CTRL_CE_STOP_ACTIVE BIT(2)
74
+#define CTRL_READMODE 0x0
75
+#define CTRL_FREADMODE 0x1
76
+#define CTRL_WRITEMODE 0x2
77
+#define CTRL_USERMODE 0x3
78
+#define SR_WEL BIT(1)
79
+
80
+/*
81
+ * Flash commands
82
+ */
83
+enum {
84
+ JEDEC_READ = 0x9f,
85
+ RDSR = 0x5,
86
+ WRDI = 0x4,
87
+ BULK_ERASE = 0xc7,
88
+ READ = 0x03,
89
+ PP = 0x02,
90
+ WRSR = 0x1,
91
+ WREN = 0x6,
92
+ SRWD = 0x80,
93
+ RESET_ENABLE = 0x66,
94
+ RESET_MEMORY = 0x99,
95
+ EN_4BYTE_ADDR = 0xB7,
96
+ ERASE_SECTOR = 0xd8,
97
+};
98
+
99
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
100
+#define FLASH_PAGE_SIZE 256
101
+
102
+typedef struct AspeedSMCTestData {
103
+ QTestState *s;
104
+ uint64_t spi_base;
105
+ uint64_t flash_base;
106
+ uint32_t jedec_id;
107
+ char *tmp_path;
108
+ uint8_t cs;
109
+ const char *node;
110
+ uint32_t page_addr;
111
+} AspeedSMCTestData;
112
+
113
+void aspeed_smc_test_read_jedec(const void *data);
114
+void aspeed_smc_test_erase_sector(const void *data);
115
+void aspeed_smc_test_erase_all(const void *data);
116
+void aspeed_smc_test_write_page(const void *data);
117
+void aspeed_smc_test_read_page_mem(const void *data);
118
+void aspeed_smc_test_write_page_mem(const void *data);
119
+void aspeed_smc_test_read_status_reg(const void *data);
120
+void aspeed_smc_test_status_reg_write_protection(const void *data);
121
+void aspeed_smc_test_write_block_protect(const void *data);
122
+void aspeed_smc_test_write_block_protect_bottom_bit(const void *data);
123
+void aspeed_smc_test_write_page_qpi(const void *data);
124
+
125
+#endif /* TESTS_ASPEED_SMC_UTILS_H */
126
diff --git a/tests/qtest/aspeed-smc-utils.c b/tests/qtest/aspeed-smc-utils.c
127
new file mode 100644
128
index XXXXXXX..XXXXXXX
129
--- /dev/null
130
+++ b/tests/qtest/aspeed-smc-utils.c
131
@@ -XXX,XX +XXX,XX @@
132
+/*
133
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
134
+ * Controller)
135
+ *
136
+ * Copyright (C) 2016 IBM Corp.
137
+ *
138
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
139
+ * of this software and associated documentation files (the "Software"), to deal
140
+ * in the Software without restriction, including without limitation the rights
141
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
142
+ * copies of the Software, and to permit persons to whom the Software is
143
+ * furnished to do so, subject to the following conditions:
144
+ *
145
+ * The above copyright notice and this permission notice shall be included in
146
+ * all copies or substantial portions of the Software.
147
+ *
148
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
149
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
150
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
151
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
152
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
153
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
154
+ * THE SOFTWARE.
155
+ */
156
+
157
+#include "qemu/osdep.h"
158
+#include "qemu/bswap.h"
159
+#include "libqtest-single.h"
160
+#include "qemu/bitops.h"
161
+#include "aspeed-smc-utils.h"
162
+
163
+/*
164
+ * Use an explicit bswap for the values read/wrote to the flash region
165
+ * as they are BE and the Aspeed CPU is LE.
166
+ */
167
+static inline uint32_t make_be32(uint32_t data)
168
+{
169
+ return bswap32(data);
170
+}
171
+
172
+static inline void spi_writel(const AspeedSMCTestData *data, uint64_t offset,
173
+ uint32_t value)
174
+{
175
+ qtest_writel(data->s, data->spi_base + offset, value);
176
+}
177
+
178
+static inline uint32_t spi_readl(const AspeedSMCTestData *data, uint64_t offset)
179
+{
180
+ return qtest_readl(data->s, data->spi_base + offset);
181
+}
182
+
183
+static inline void flash_writeb(const AspeedSMCTestData *data, uint64_t offset,
184
+ uint8_t value)
185
+{
186
+ qtest_writeb(data->s, data->flash_base + offset, value);
187
+}
188
+
189
+static inline void flash_writel(const AspeedSMCTestData *data, uint64_t offset,
190
+ uint32_t value)
191
+{
192
+ qtest_writel(data->s, data->flash_base + offset, value);
193
+}
194
+
195
+static inline uint8_t flash_readb(const AspeedSMCTestData *data,
196
+ uint64_t offset)
197
+{
198
+ return qtest_readb(data->s, data->flash_base + offset);
199
+}
200
+
201
+static inline uint32_t flash_readl(const AspeedSMCTestData *data,
202
+ uint64_t offset)
203
+{
204
+ return qtest_readl(data->s, data->flash_base + offset);
205
+}
206
+
207
+static void spi_conf(const AspeedSMCTestData *data, uint32_t value)
208
+{
209
+ uint32_t conf = spi_readl(data, R_CONF);
210
+
211
+ conf |= value;
212
+ spi_writel(data, R_CONF, conf);
213
+}
214
+
215
+static void spi_conf_remove(const AspeedSMCTestData *data, uint32_t value)
216
+{
217
+ uint32_t conf = spi_readl(data, R_CONF);
218
+
219
+ conf &= ~value;
220
+ spi_writel(data, R_CONF, conf);
221
+}
222
+
223
+static void spi_ce_ctrl(const AspeedSMCTestData *data, uint32_t value)
224
+{
225
+ uint32_t conf = spi_readl(data, R_CE_CTRL);
226
+
227
+ conf |= value;
228
+ spi_writel(data, R_CE_CTRL, conf);
229
+}
230
+
231
+static void spi_ctrl_setmode(const AspeedSMCTestData *data, uint8_t mode,
232
+ uint8_t cmd)
233
+{
234
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
235
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
236
+ ctrl &= ~(CTRL_USERMODE | 0xff << 16);
237
+ ctrl |= mode | (cmd << 16);
238
+ spi_writel(data, ctrl_reg, ctrl);
239
+}
240
+
241
+static void spi_ctrl_start_user(const AspeedSMCTestData *data)
242
+{
243
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
244
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
245
+
246
+ ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
247
+ spi_writel(data, ctrl_reg, ctrl);
248
+
249
+ ctrl &= ~CTRL_CE_STOP_ACTIVE;
250
+ spi_writel(data, ctrl_reg, ctrl);
251
+}
252
+
253
+static void spi_ctrl_stop_user(const AspeedSMCTestData *data)
254
+{
255
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
256
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
257
+
258
+ ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
259
+ spi_writel(data, ctrl_reg, ctrl);
260
+}
261
+
262
+static void spi_ctrl_set_io_mode(const AspeedSMCTestData *data, uint32_t value)
263
+{
264
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
265
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
266
+ uint32_t mode;
267
+
268
+ mode = value & CTRL_IO_MODE_MASK;
269
+ ctrl &= ~CTRL_IO_MODE_MASK;
270
+ ctrl |= mode;
271
+ spi_writel(data, ctrl_reg, ctrl);
272
+}
273
+
274
+static void flash_reset(const AspeedSMCTestData *data)
275
+{
276
+ spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
277
+
278
+ spi_ctrl_start_user(data);
279
+ flash_writeb(data, 0, RESET_ENABLE);
280
+ flash_writeb(data, 0, RESET_MEMORY);
281
+ flash_writeb(data, 0, WREN);
282
+ flash_writeb(data, 0, BULK_ERASE);
283
+ flash_writeb(data, 0, WRDI);
284
+ spi_ctrl_stop_user(data);
285
+
286
+ spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
287
+}
288
+
289
+static void read_page(const AspeedSMCTestData *data, uint32_t addr,
290
+ uint32_t *page)
291
+{
292
+ int i;
293
+
294
+ spi_ctrl_start_user(data);
295
+
296
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
297
+ flash_writeb(data, 0, READ);
298
+ flash_writel(data, 0, make_be32(addr));
299
+
300
+ /* Continuous read are supported */
301
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
302
+ page[i] = make_be32(flash_readl(data, 0));
303
+ }
304
+ spi_ctrl_stop_user(data);
305
+}
306
+
307
+static void read_page_mem(const AspeedSMCTestData *data, uint32_t addr,
308
+ uint32_t *page)
309
+{
310
+ int i;
311
+
312
+ /* move out USER mode to use direct reads from the AHB bus */
313
+ spi_ctrl_setmode(data, CTRL_READMODE, READ);
314
+
315
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
316
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
317
+ }
318
+}
319
+
320
+static void write_page_mem(const AspeedSMCTestData *data, uint32_t addr,
321
+ uint32_t write_value)
322
+{
323
+ spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
324
+
325
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
326
+ flash_writel(data, addr + i * 4, write_value);
327
+ }
328
+}
329
+
330
+static void assert_page_mem(const AspeedSMCTestData *data, uint32_t addr,
331
+ uint32_t expected_value)
332
+{
333
+ uint32_t page[FLASH_PAGE_SIZE / 4];
334
+ read_page_mem(data, addr, page);
335
+ for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
336
+ g_assert_cmphex(page[i], ==, expected_value);
337
+ }
338
+}
339
+
340
+void aspeed_smc_test_read_jedec(const void *data)
341
+{
342
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
343
+ uint32_t jedec = 0x0;
344
+
345
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
346
+
347
+ spi_ctrl_start_user(test_data);
348
+ flash_writeb(test_data, 0, JEDEC_READ);
349
+ jedec |= flash_readb(test_data, 0) << 16;
350
+ jedec |= flash_readb(test_data, 0) << 8;
351
+ jedec |= flash_readb(test_data, 0);
352
+ spi_ctrl_stop_user(test_data);
353
+
354
+ flash_reset(test_data);
355
+
356
+ g_assert_cmphex(jedec, ==, test_data->jedec_id);
357
+}
358
+
359
+void aspeed_smc_test_erase_sector(const void *data)
360
+{
361
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
362
+ uint32_t some_page_addr = test_data->page_addr;
363
+ uint32_t page[FLASH_PAGE_SIZE / 4];
364
+ int i;
365
+
366
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
367
+
368
+ /*
369
+ * Previous page should be full of 0xffs after backend is
370
+ * initialized
371
+ */
372
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
373
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
374
+ g_assert_cmphex(page[i], ==, 0xffffffff);
375
+ }
376
+
377
+ spi_ctrl_start_user(test_data);
378
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
379
+ flash_writeb(test_data, 0, WREN);
380
+ flash_writeb(test_data, 0, PP);
381
+ flash_writel(test_data, 0, make_be32(some_page_addr));
382
+
383
+ /* Fill the page with its own addresses */
384
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
385
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
386
+ }
387
+ spi_ctrl_stop_user(test_data);
388
+
389
+ /* Check the page is correctly written */
390
+ read_page(test_data, some_page_addr, page);
391
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
392
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
393
+ }
394
+
395
+ spi_ctrl_start_user(test_data);
396
+ flash_writeb(test_data, 0, WREN);
397
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
398
+ flash_writeb(test_data, 0, ERASE_SECTOR);
399
+ flash_writel(test_data, 0, make_be32(some_page_addr));
400
+ spi_ctrl_stop_user(test_data);
401
+
402
+ /* Check the page is erased */
403
+ read_page(test_data, some_page_addr, page);
404
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
405
+ g_assert_cmphex(page[i], ==, 0xffffffff);
406
+ }
407
+
408
+ flash_reset(test_data);
409
+}
410
+
411
+void aspeed_smc_test_erase_all(const void *data)
412
+{
413
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
414
+ uint32_t some_page_addr = test_data->page_addr;
415
+ uint32_t page[FLASH_PAGE_SIZE / 4];
416
+ int i;
417
+
418
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
419
+
420
+ /*
421
+ * Previous page should be full of 0xffs after backend is
422
+ * initialized
423
+ */
424
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
425
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
426
+ g_assert_cmphex(page[i], ==, 0xffffffff);
427
+ }
428
+
429
+ spi_ctrl_start_user(test_data);
430
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
431
+ flash_writeb(test_data, 0, WREN);
432
+ flash_writeb(test_data, 0, PP);
433
+ flash_writel(test_data, 0, make_be32(some_page_addr));
434
+
435
+ /* Fill the page with its own addresses */
436
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
437
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
438
+ }
439
+ spi_ctrl_stop_user(test_data);
440
+
441
+ /* Check the page is correctly written */
442
+ read_page(test_data, some_page_addr, page);
443
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
444
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
445
+ }
446
+
447
+ spi_ctrl_start_user(test_data);
448
+ flash_writeb(test_data, 0, WREN);
449
+ flash_writeb(test_data, 0, BULK_ERASE);
450
+ spi_ctrl_stop_user(test_data);
451
+
452
+ /* Check the page is erased */
453
+ read_page(test_data, some_page_addr, page);
454
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
455
+ g_assert_cmphex(page[i], ==, 0xffffffff);
456
+ }
457
+
458
+ flash_reset(test_data);
459
+}
460
+
461
+void aspeed_smc_test_write_page(const void *data)
462
+{
463
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
464
+ uint32_t my_page_addr = test_data->page_addr;
465
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
466
+ uint32_t page[FLASH_PAGE_SIZE / 4];
467
+ int i;
468
+
469
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
470
+
471
+ spi_ctrl_start_user(test_data);
472
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
473
+ flash_writeb(test_data, 0, WREN);
474
+ flash_writeb(test_data, 0, PP);
475
+ flash_writel(test_data, 0, make_be32(my_page_addr));
476
+
477
+ /* Fill the page with its own addresses */
478
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
479
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
480
+ }
481
+ spi_ctrl_stop_user(test_data);
482
+
483
+ /* Check what was written */
484
+ read_page(test_data, my_page_addr, page);
485
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
486
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
487
+ }
488
+
489
+ /* Check some other page. It should be full of 0xff */
490
+ read_page(test_data, some_page_addr, page);
491
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
492
+ g_assert_cmphex(page[i], ==, 0xffffffff);
493
+ }
494
+
495
+ flash_reset(test_data);
496
+}
497
+
498
+void aspeed_smc_test_read_page_mem(const void *data)
499
+{
500
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
501
+ uint32_t my_page_addr = test_data->page_addr;
502
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
503
+ uint32_t page[FLASH_PAGE_SIZE / 4];
504
+ int i;
505
+
506
+ /*
507
+ * Enable 4BYTE mode for controller.
508
+ */
509
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
510
+
511
+ /* Enable 4BYTE mode for flash. */
512
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
513
+ spi_ctrl_start_user(test_data);
514
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
515
+ flash_writeb(test_data, 0, WREN);
516
+ flash_writeb(test_data, 0, PP);
517
+ flash_writel(test_data, 0, make_be32(my_page_addr));
518
+
519
+ /* Fill the page with its own addresses */
520
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
521
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
522
+ }
523
+ spi_ctrl_stop_user(test_data);
524
+ spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
525
+
526
+ /* Check what was written */
527
+ read_page_mem(test_data, my_page_addr, page);
528
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
529
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
530
+ }
531
+
532
+ /* Check some other page. It should be full of 0xff */
533
+ read_page_mem(test_data, some_page_addr, page);
534
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
535
+ g_assert_cmphex(page[i], ==, 0xffffffff);
536
+ }
537
+
538
+ flash_reset(test_data);
539
+}
540
+
541
+void aspeed_smc_test_write_page_mem(const void *data)
542
+{
543
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
544
+ uint32_t my_page_addr = test_data->page_addr;
545
+ uint32_t page[FLASH_PAGE_SIZE / 4];
546
+ int i;
547
+
548
+ /*
549
+ * Enable 4BYTE mode for controller.
550
+ */
551
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
552
+
553
+ /* Enable 4BYTE mode for flash. */
554
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
555
+ spi_ctrl_start_user(test_data);
556
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
557
+ flash_writeb(test_data, 0, WREN);
558
+ spi_ctrl_stop_user(test_data);
559
+
560
+ /* move out USER mode to use direct writes to the AHB bus */
561
+ spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
562
+
563
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
564
+ flash_writel(test_data, my_page_addr + i * 4,
565
+ make_be32(my_page_addr + i * 4));
566
+ }
567
+
568
+ /* Check what was written */
569
+ read_page_mem(test_data, my_page_addr, page);
570
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
571
+ g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
572
+ }
573
+
574
+ flash_reset(test_data);
575
+}
576
+
577
+void aspeed_smc_test_read_status_reg(const void *data)
578
+{
579
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
580
+ uint8_t r;
581
+
582
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
583
+
584
+ spi_ctrl_start_user(test_data);
585
+ flash_writeb(test_data, 0, RDSR);
586
+ r = flash_readb(test_data, 0);
587
+ spi_ctrl_stop_user(test_data);
588
+
589
+ g_assert_cmphex(r & SR_WEL, ==, 0);
590
+ g_assert(!qtest_qom_get_bool
591
+ (test_data->s, test_data->node, "write-enable"));
592
+
593
+ spi_ctrl_start_user(test_data);
594
+ flash_writeb(test_data, 0, WREN);
595
+ flash_writeb(test_data, 0, RDSR);
596
+ r = flash_readb(test_data, 0);
597
+ spi_ctrl_stop_user(test_data);
598
+
599
+ g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
600
+ g_assert(qtest_qom_get_bool
601
+ (test_data->s, test_data->node, "write-enable"));
602
+
603
+ spi_ctrl_start_user(test_data);
604
+ flash_writeb(test_data, 0, WRDI);
605
+ flash_writeb(test_data, 0, RDSR);
606
+ r = flash_readb(test_data, 0);
607
+ spi_ctrl_stop_user(test_data);
608
+
609
+ g_assert_cmphex(r & SR_WEL, ==, 0);
610
+ g_assert(!qtest_qom_get_bool
611
+ (test_data->s, test_data->node, "write-enable"));
612
+
613
+ flash_reset(test_data);
614
+}
615
+
616
+void aspeed_smc_test_status_reg_write_protection(const void *data)
617
+{
618
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
619
+ uint8_t r;
620
+
621
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
622
+
623
+ /* default case: WP# is high and SRWD is low -> status register writable */
624
+ spi_ctrl_start_user(test_data);
625
+ flash_writeb(test_data, 0, WREN);
626
+ /* test ability to write SRWD */
627
+ flash_writeb(test_data, 0, WRSR);
628
+ flash_writeb(test_data, 0, SRWD);
629
+ flash_writeb(test_data, 0, RDSR);
630
+ r = flash_readb(test_data, 0);
631
+ spi_ctrl_stop_user(test_data);
632
+ g_assert_cmphex(r & SRWD, ==, SRWD);
633
+
634
+ /* WP# high and SRWD high -> status register writable */
635
+ spi_ctrl_start_user(test_data);
636
+ flash_writeb(test_data, 0, WREN);
637
+ /* test ability to write SRWD */
638
+ flash_writeb(test_data, 0, WRSR);
639
+ flash_writeb(test_data, 0, 0);
640
+ flash_writeb(test_data, 0, RDSR);
641
+ r = flash_readb(test_data, 0);
642
+ spi_ctrl_stop_user(test_data);
643
+ g_assert_cmphex(r & SRWD, ==, 0);
644
+
645
+ /* WP# low and SRWD low -> status register writable */
646
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
647
+ spi_ctrl_start_user(test_data);
648
+ flash_writeb(test_data, 0, WREN);
649
+ /* test ability to write SRWD */
650
+ flash_writeb(test_data, 0, WRSR);
651
+ flash_writeb(test_data, 0, SRWD);
652
+ flash_writeb(test_data, 0, RDSR);
653
+ r = flash_readb(test_data, 0);
654
+ spi_ctrl_stop_user(test_data);
655
+ g_assert_cmphex(r & SRWD, ==, SRWD);
656
+
657
+ /* WP# low and SRWD high -> status register NOT writable */
658
+ spi_ctrl_start_user(test_data);
659
+ flash_writeb(test_data, 0 , WREN);
660
+ /* test ability to write SRWD */
661
+ flash_writeb(test_data, 0, WRSR);
662
+ flash_writeb(test_data, 0, 0);
663
+ flash_writeb(test_data, 0, RDSR);
664
+ r = flash_readb(test_data, 0);
665
+ spi_ctrl_stop_user(test_data);
666
+ /* write is not successful */
667
+ g_assert_cmphex(r & SRWD, ==, SRWD);
668
+
669
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
670
+ flash_reset(test_data);
671
+}
672
+
673
+void aspeed_smc_test_write_block_protect(const void *data)
674
+{
675
+ const AspeedSMCTestData *test_data = (const AspeedSMCTestData *)data;
676
+ uint32_t sector_size = 65536;
677
+ uint32_t n_sectors = 512;
678
+
679
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
680
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
681
+
682
+ uint32_t bp_bits = 0b0;
683
+
684
+ for (int i = 0; i < 16; i++) {
685
+ bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
686
+
687
+ spi_ctrl_start_user(test_data);
688
+ flash_writeb(test_data, 0, WREN);
689
+ flash_writeb(test_data, 0, BULK_ERASE);
690
+ flash_writeb(test_data, 0, WREN);
691
+ flash_writeb(test_data, 0, WRSR);
692
+ flash_writeb(test_data, 0, bp_bits);
693
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
694
+ flash_writeb(test_data, 0, WREN);
695
+ spi_ctrl_stop_user(test_data);
696
+
697
+ uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
698
+ uint32_t protection_start = n_sectors - num_protected_sectors;
699
+ uint32_t protection_end = n_sectors;
700
+
701
+ for (int sector = 0; sector < n_sectors; sector++) {
702
+ uint32_t addr = sector * sector_size;
703
+
704
+ assert_page_mem(test_data, addr, 0xffffffff);
705
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
706
+
707
+ uint32_t expected_value = protection_start <= sector
708
+ && sector < protection_end
709
+ ? 0xffffffff : 0xabcdef12;
710
+
711
+ assert_page_mem(test_data, addr, expected_value);
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
28
index XXXXXXX..XXXXXXX 100644
819
index XXXXXXX..XXXXXXX 100644
29
--- a/include/hw/misc/aspeed_hace.h
820
--- a/tests/qtest/aspeed_smc-test.c
30
+++ b/include/hw/misc/aspeed_hace.h
821
+++ b/tests/qtest/aspeed_smc-test.c
31
@@ -XXX,XX +XXX,XX @@
822
@@ -XXX,XX +XXX,XX @@
32
/*
823
#include "qemu/bswap.h"
33
* ASPEED Hash and Crypto Engine
824
#include "libqtest-single.h"
34
*
825
#include "qemu/bitops.h"
35
+ * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
826
+#include "aspeed-smc-utils.h"
36
* Copyright (C) 2021 IBM Corp.
827
37
*
828
-/*
38
* SPDX-License-Identifier: GPL-2.0-or-later
829
- * ASPEED SPI Controller registers
39
@@ -XXX,XX +XXX,XX @@
830
- */
40
#define ASPEED_HACE_H
831
-#define R_CONF 0x00
41
832
-#define CONF_ENABLE_W0 16
42
#include "hw/sysbus.h"
833
-#define R_CE_CTRL 0x04
43
+#include "crypto/hash.h"
834
-#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
44
835
-#define R_CTRL0 0x10
45
#define TYPE_ASPEED_HACE "aspeed.hace"
836
-#define CTRL_IO_QUAD_IO BIT(31)
46
#define TYPE_ASPEED_AST2400_HACE TYPE_ASPEED_HACE "-ast2400"
837
-#define CTRL_CE_STOP_ACTIVE BIT(2)
47
@@ -XXX,XX +XXX,XX @@ struct AspeedHACEState {
838
-#define CTRL_READMODE 0x0
48
839
-#define CTRL_FREADMODE 0x1
49
MemoryRegion *dram_mr;
840
-#define CTRL_WRITEMODE 0x2
50
AddressSpace dram_as;
841
-#define CTRL_USERMODE 0x3
51
+
842
-#define SR_WEL BIT(1)
52
+ QCryptoHash *hash_ctx;
843
-
53
};
844
-/*
54
845
- * Flash commands
55
846
- */
56
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
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
57
index XXXXXXX..XXXXXXX 100644
1687
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/misc/aspeed_hace.c
1688
--- a/tests/qtest/meson.build
59
+++ b/hw/misc/aspeed_hace.c
1689
+++ b/tests/qtest/meson.build
60
@@ -XXX,XX +XXX,XX @@
1690
@@ -XXX,XX +XXX,XX @@ qtests = {
61
/*
1691
'virtio-net-failover': files('migration-helpers.c'),
62
* ASPEED Hash and Crypto Engine
1692
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
63
*
1693
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
64
+ * Copyright (c) 2024 Seagate Technology LLC and/or its Affiliates
1694
+ 'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
65
* Copyright (C) 2021 IBM Corp.
66
*
67
* Joel Stanley <joel@jms.id.au>
68
@@ -XXX,XX +XXX,XX @@ static int reconstruct_iov(AspeedHACEState *s, struct iovec *iov, int id,
69
return iov_count;
70
}
1695
}
71
1696
72
-/**
1697
if vnc.found()
73
- * Generate iov for accumulative mode.
74
- *
75
- * @param s aspeed hace state object
76
- * @param iov iov of the current request
77
- * @param id index of the current iov
78
- * @param req_len length of the current request
79
- *
80
- * @return count of iov
81
- */
82
-static int gen_acc_mode_iov(AspeedHACEState *s, struct iovec *iov, int id,
83
- hwaddr *req_len)
84
-{
85
- uint32_t pad_offset;
86
- uint32_t total_msg_len;
87
- s->total_req_len += *req_len;
88
-
89
- if (has_padding(s, &iov[id], *req_len, &total_msg_len, &pad_offset)) {
90
- if (s->iov_count) {
91
- return reconstruct_iov(s, iov, id, &pad_offset);
92
- }
93
-
94
- *req_len -= s->total_req_len - total_msg_len;
95
- s->total_req_len = 0;
96
- iov[id].iov_len = *req_len;
97
- } else {
98
- s->iov_cache[s->iov_count].iov_base = iov->iov_base;
99
- s->iov_cache[s->iov_count].iov_len = *req_len;
100
- ++s->iov_count;
101
- }
102
-
103
- return id + 1;
104
-}
105
-
106
static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
107
bool acc_mode)
108
{
109
struct iovec iov[ASPEED_HACE_MAX_SG];
110
+ uint32_t total_msg_len;
111
+ uint32_t pad_offset;
112
g_autofree uint8_t *digest_buf = NULL;
113
size_t digest_len = 0;
114
- int niov = 0;
115
+ bool sg_acc_mode_final_request = false;
116
int i;
117
void *haddr;
118
+ Error *local_err = NULL;
119
+
120
+ if (acc_mode && s->hash_ctx == NULL) {
121
+ s->hash_ctx = qcrypto_hash_new(algo, &local_err);
122
+ if (s->hash_ctx == NULL) {
123
+ qemu_log_mask(LOG_GUEST_ERROR, "qcrypto hash failed : %s",
124
+ error_get_pretty(local_err));
125
+ error_free(local_err);
126
+ return;
127
+ }
128
+ }
129
130
if (sg_mode) {
131
uint32_t len = 0;
132
@@ -XXX,XX +XXX,XX @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
133
}
134
iov[i].iov_base = haddr;
135
if (acc_mode) {
136
- niov = gen_acc_mode_iov(s, iov, i, &plen);
137
-
138
+ s->total_req_len += plen;
139
+
140
+ if (has_padding(s, &iov[i], plen, &total_msg_len,
141
+ &pad_offset)) {
142
+ /* Padding being present indicates the final request */
143
+ sg_acc_mode_final_request = true;
144
+ iov[i].iov_len = pad_offset;
145
+ } else {
146
+ iov[i].iov_len = plen;
147
+ }
148
} else {
149
iov[i].iov_len = plen;
150
}
151
@@ -XXX,XX +XXX,XX @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
152
* required to check whether cache is empty. If no, we should
153
* combine cached iov and the current iov.
154
*/
155
- uint32_t total_msg_len;
156
- uint32_t pad_offset;
157
s->total_req_len += len;
158
if (has_padding(s, iov, len, &total_msg_len, &pad_offset)) {
159
- niov = reconstruct_iov(s, iov, 0, &pad_offset);
160
+ i = reconstruct_iov(s, iov, 0, &pad_offset);
161
}
162
}
163
}
164
165
- if (niov) {
166
- i = niov;
167
- }
168
+ if (acc_mode) {
169
+ if (qcrypto_hash_updatev(s->hash_ctx, iov, i, &local_err) < 0) {
170
+ qemu_log_mask(LOG_GUEST_ERROR, "qcrypto hash update failed : %s",
171
+ error_get_pretty(local_err));
172
+ error_free(local_err);
173
+ return;
174
+ }
175
+
176
+ if (sg_acc_mode_final_request) {
177
+ if (qcrypto_hash_finalize_bytes(s->hash_ctx, &digest_buf,
178
+ &digest_len, &local_err)) {
179
+ qemu_log_mask(LOG_GUEST_ERROR,
180
+ "qcrypto hash finalize failed : %s",
181
+ error_get_pretty(local_err));
182
+ error_free(local_err);
183
+ local_err = NULL;
184
+ }
185
186
- if (qcrypto_hash_bytesv(algo, iov, i, &digest_buf, &digest_len, NULL) < 0) {
187
- qemu_log_mask(LOG_GUEST_ERROR, "%s: qcrypto failed\n", __func__);
188
+ qcrypto_hash_free(s->hash_ctx);
189
+
190
+ s->hash_ctx = NULL;
191
+ s->iov_count = 0;
192
+ s->total_req_len = 0;
193
+ }
194
+ } else if (qcrypto_hash_bytesv(algo, iov, i, &digest_buf,
195
+ &digest_len, &local_err) < 0) {
196
+ qemu_log_mask(LOG_GUEST_ERROR, "qcrypto hash bytesv failed : %s",
197
+ error_get_pretty(local_err));
198
+ error_free(local_err);
199
return;
200
}
201
202
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_reset(DeviceState *dev)
203
{
204
struct AspeedHACEState *s = ASPEED_HACE(dev);
205
206
+ if (s->hash_ctx != NULL) {
207
+ qcrypto_hash_free(s->hash_ctx);
208
+ s->hash_ctx = NULL;
209
+ }
210
+
211
memset(s->regs, 0, sizeof(s->regs));
212
s->iov_count = 0;
213
s->total_req_len = 0;
214
--
1698
--
215
2.47.0
1699
2.47.1
216
1700
217
1701
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Add GPIO test cases to test output and input pins from A0 to D7 for AST2700.
3
Add test_ast2700_evb function and reused testcases which are from
4
aspeed_smc-test.c for AST2700 testing. The base address, flash base address
5
and ce index of fmc_cs0 are 0x14000000, 0x100000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "w25q01jvq" whose size is 128MB,
7
so set jedec_id 0xef4021.
4
8
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Thomas Huth <thuth@redhat.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
[ clg: - Updated MAINTAINERS ]
11
Link: https://lore.kernel.org/r/20241127091543.1243114-11-jamin_lin@aspeedtech.com
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
---
13
---
10
MAINTAINERS | 1 +
14
tests/qtest/ast2700-smc-test.c | 71 ++++++++++++++++++++++++++++++++++
11
tests/qtest/ast2700-gpio-test.c | 95 +++++++++++++++++++++++++++++++++
15
tests/qtest/meson.build | 4 +-
12
tests/qtest/meson.build | 3 ++
16
2 files changed, 74 insertions(+), 1 deletion(-)
13
3 files changed, 99 insertions(+)
17
create mode 100644 tests/qtest/ast2700-smc-test.c
14
create mode 100644 tests/qtest/ast2700-gpio-test.c
15
18
16
diff --git a/MAINTAINERS b/MAINTAINERS
19
diff --git a/tests/qtest/ast2700-smc-test.c b/tests/qtest/ast2700-smc-test.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/MAINTAINERS
19
+++ b/MAINTAINERS
20
@@ -XXX,XX +XXX,XX @@ F: hw/net/ftgmac100.c
21
F: include/hw/net/ftgmac100.h
22
F: docs/system/arm/aspeed.rst
23
F: tests/*/*aspeed*
24
+F: tests/*/*ast2700*
25
F: hw/arm/fby35.c
26
27
NRF51
28
diff --git a/tests/qtest/ast2700-gpio-test.c b/tests/qtest/ast2700-gpio-test.c
29
new file mode 100644
20
new file mode 100644
30
index XXXXXXX..XXXXXXX
21
index XXXXXXX..XXXXXXX
31
--- /dev/null
22
--- /dev/null
32
+++ b/tests/qtest/ast2700-gpio-test.c
23
+++ b/tests/qtest/ast2700-smc-test.c
33
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
34
+/*
25
+/*
35
+ * QTest testcase for the ASPEED AST2700 GPIO Controller.
26
+ * QTest testcase for the M25P80 Flash using the ASPEED SPI Controller since
27
+ * AST2700.
36
+ *
28
+ *
37
+ * SPDX-License-Identifier: GPL-2.0-or-later
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
38
+ * Copyright (C) 2024 ASPEED Technology Inc.
30
+ * Copyright (C) 2024 ASPEED Technology Inc.
39
+ */
31
+ */
40
+
32
+
41
+#include "qemu/osdep.h"
33
+#include "qemu/osdep.h"
34
+#include "qemu/bswap.h"
35
+#include "libqtest-single.h"
42
+#include "qemu/bitops.h"
36
+#include "qemu/bitops.h"
43
+#include "qemu/timer.h"
37
+#include "aspeed-smc-utils.h"
44
+#include "qapi/qmp/qdict.h"
45
+#include "libqtest-single.h"
46
+
38
+
47
+#define AST2700_GPIO_BASE 0x14C0B000
39
+static void test_ast2700_evb(AspeedSMCTestData *data)
48
+#define GPIOA0_CONTROL 0x180
40
+{
41
+ int ret;
42
+ int fd;
49
+
43
+
50
+static void test_output_pins(const char *machine, const uint32_t base)
44
+ fd = g_file_open_tmp("qtest.m25p80.w25q01jvq.XXXXXX",
51
+{
45
+ &data->tmp_path, NULL);
52
+ QTestState *s = qtest_init(machine);
46
+ g_assert(fd >= 0);
53
+ uint32_t offset = 0;
47
+ ret = ftruncate(fd, 128 * 1024 * 1024);
54
+ uint32_t value = 0;
48
+ g_assert(ret == 0);
55
+ uint32_t pin = 0;
49
+ close(fd);
56
+
50
+
57
+ for (char c = 'A'; c <= 'D'; c++) {
51
+ data->s = qtest_initf("-machine ast2700-evb "
58
+ for (int i = 0; i < 8; i++) {
52
+ "-drive file=%s,format=raw,if=mtd",
59
+ offset = base + (pin * 4);
53
+ data->tmp_path);
60
+
54
+
61
+ /* output direction and output hi */
55
+ /* fmc cs0 with w25q01jvq flash */
62
+ qtest_writel(s, offset, 0x00000003);
56
+ data->flash_base = 0x100000000;
63
+ value = qtest_readl(s, offset);
57
+ data->spi_base = 0x14000000;
64
+ g_assert_cmphex(value, ==, 0x00000003);
58
+ data->jedec_id = 0xef4021;
59
+ data->cs = 0;
60
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
61
+ /* beyond 64MB */
62
+ data->page_addr = 0x40000 * FLASH_PAGE_SIZE;
65
+
63
+
66
+ /* output direction and output low */
64
+ qtest_add_data_func("/ast2700/smc/read_jedec",
67
+ qtest_writel(s, offset, 0x00000002);
65
+ data, aspeed_smc_test_read_jedec);
68
+ value = qtest_readl(s, offset);
66
+ qtest_add_data_func("/ast2700/smc/erase_sector",
69
+ g_assert_cmphex(value, ==, 0x00000002);
67
+ data, aspeed_smc_test_erase_sector);
70
+ pin++;
68
+ qtest_add_data_func("/ast2700/smc/erase_all",
71
+ }
69
+ data, aspeed_smc_test_erase_all);
72
+ }
70
+ qtest_add_data_func("/ast2700/smc/write_page",
73
+
71
+ data, aspeed_smc_test_write_page);
74
+ qtest_quit(s);
72
+ qtest_add_data_func("/ast2700/smc/read_page_mem",
75
+}
73
+ data, aspeed_smc_test_read_page_mem);
76
+
74
+ qtest_add_data_func("/ast2700/smc/write_page_mem",
77
+static void test_input_pins(const char *machine, const uint32_t base)
75
+ data, aspeed_smc_test_write_page_mem);
78
+{
76
+ qtest_add_data_func("/ast2700/smc/read_status_reg",
79
+ QTestState *s = qtest_init(machine);
77
+ data, aspeed_smc_test_read_status_reg);
80
+ char name[16];
78
+ qtest_add_data_func("/ast2700/smc/write_page_qpi",
81
+ uint32_t offset = 0;
79
+ data, aspeed_smc_test_write_page_qpi);
82
+ uint32_t value = 0;
83
+ uint32_t pin = 0;
84
+
85
+ for (char c = 'A'; c <= 'D'; c++) {
86
+ for (int i = 0; i < 8; i++) {
87
+ sprintf(name, "gpio%c%d", c, i);
88
+ offset = base + (pin * 4);
89
+ /* input direction */
90
+ qtest_writel(s, offset, 0);
91
+
92
+ /* set input */
93
+ qtest_qom_set_bool(s, "/machine/soc/gpio", name, true);
94
+ value = qtest_readl(s, offset);
95
+ g_assert_cmphex(value, ==, 0x00002000);
96
+
97
+ /* clear input */
98
+ qtest_qom_set_bool(s, "/machine/soc/gpio", name, false);
99
+ value = qtest_readl(s, offset);
100
+ g_assert_cmphex(value, ==, 0);
101
+ pin++;
102
+ }
103
+ }
104
+
105
+ qtest_quit(s);
106
+}
107
+
108
+static void test_2700_input_pins(void)
109
+{
110
+ test_input_pins("-machine ast2700-evb",
111
+ AST2700_GPIO_BASE + GPIOA0_CONTROL);
112
+}
113
+
114
+static void test_2700_output_pins(void)
115
+{
116
+ test_output_pins("-machine ast2700-evb",
117
+ AST2700_GPIO_BASE + GPIOA0_CONTROL);
118
+}
80
+}
119
+
81
+
120
+int main(int argc, char **argv)
82
+int main(int argc, char **argv)
121
+{
83
+{
84
+ AspeedSMCTestData ast2700_evb_data;
85
+ int ret;
86
+
122
+ g_test_init(&argc, &argv, NULL);
87
+ g_test_init(&argc, &argv, NULL);
123
+
88
+
124
+ qtest_add_func("/ast2700/gpio/input_pins", test_2700_input_pins);
89
+ test_ast2700_evb(&ast2700_evb_data);
125
+ qtest_add_func("/ast2700/gpio/output_pins", test_2700_output_pins);
90
+ ret = g_test_run();
126
+
91
+
127
+ return g_test_run();
92
+ qtest_quit(ast2700_evb_data.s);
93
+ unlink(ast2700_evb_data.tmp_path);
94
+ return ret;
128
+}
95
+}
129
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
96
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
130
index XXXXXXX..XXXXXXX 100644
97
index XXXXXXX..XXXXXXX 100644
131
--- a/tests/qtest/meson.build
98
--- a/tests/qtest/meson.build
132
+++ b/tests/qtest/meson.build
99
+++ b/tests/qtest/meson.build
133
@@ -XXX,XX +XXX,XX @@ qtests_aspeed = \
100
@@ -XXX,XX +XXX,XX @@ qtests_aspeed = \
134
['aspeed_hace-test',
135
'aspeed_smc-test',
101
'aspeed_smc-test',
136
'aspeed_gpio-test']
102
'aspeed_gpio-test']
137
+qtests_aspeed64 = \
103
qtests_aspeed64 = \
138
+ ['ast2700-gpio-test']
104
- ['ast2700-gpio-test']
105
+ ['ast2700-gpio-test',
106
+ 'ast2700-smc-test']
139
107
140
qtests_stm32l4x5 = \
108
qtests_stm32l4x5 = \
141
['stm32l4x5_exti-test',
109
['stm32l4x5_exti-test',
142
@@ -XXX,XX +XXX,XX @@ qtests_aarch64 = \
110
@@ -XXX,XX +XXX,XX @@ qtests = {
143
(config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test', 'bcm2835-i2c-test'] : []) + \
111
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
144
(config_all_accel.has_key('CONFIG_TCG') and \
112
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
145
config_all_devices.has_key('CONFIG_TPM_TIS_I2C') ? ['tpm-tis-i2c-test'] : []) + \
113
'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
146
+ (config_all_devices.has_key('CONFIG_ASPEED_SOC') ? qtests_aspeed64 : []) + \
114
+ 'ast2700-smc-test': files('aspeed-smc-utils.c', 'ast2700-smc-test.c'),
147
['arm-cpu-features',
115
}
148
'numa-test',
116
149
'boot-serial-test',
117
if vnc.found()
150
--
118
--
151
2.47.0
119
2.47.1
152
120
153
121
diff view generated by jsdifflib