1
The following changes since commit f200ff158d5abcb974a6b597a962b6b2fbea2b06:
1
The following changes since commit ae35f033b874c627d81d51070187fbf55f0bf1a7:
2
2
3
Merge tag 'pull-tcg-20220621' of https://gitlab.com/rth7680/qemu into staging (2022-06-21 13:47:20 -0700)
3
Update version for v9.2.0 release (2024-12-10 16:20:54 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20220622
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20241211
8
8
9
for you to fetch changes up to 92a45bde8cf4257f755ce718fbf7db5f2d607a15:
9
for you to fetch changes up to 124f4dc0d832c1bf3a4513c05a2b93bac0a5fac0:
10
10
11
hw: m25p80: fixing individual test failure when tests are running in isolation (2022-06-22 09:49:34 +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
* Extra avocado tests using buildroot images
16
* Removed tacoma-bmc machine
17
* Conversion of the I2C model to the registerfield interface
17
* Added support for SDHCI on AST2700 SoC
18
* Support for the I2C new register interface on AST2600
18
* Improved functional tests
19
* Various I2C enhancements
19
* Extended SMC qtest to all Aspeed SoCs
20
* I2C support for the AST1030
21
* Improvement of the Aspeed SMC and m25p80 qtest
22
20
23
----------------------------------------------------------------
21
----------------------------------------------------------------
24
Cédric Le Goater (8):
22
Cédric Le Goater (8):
25
aspeed: Remove fake RTC device on ast2500-evb
23
arm: Remove tacoma-bmc machine
26
test/avocado/machine_aspeed.py: Move OpenBMC tests
24
tests/functional: Introduce a specific test for ast1030 SoC
27
test/avocado/machine_aspeed.py: Add tests using buildroot images
25
tests/functional: Introduce a specific test for palmetto-bmc machine
28
test/avocado/machine_aspeed.py: Add I2C tests to ast2500-evb
26
tests/functional: Introduce a specific test for romulus-bmc machine
29
test/avocado/machine_aspeed.py: Add I2C tests to ast2600-evb
27
tests/functional: Introduce a specific test for ast2500 SoC
30
test/avocado/machine_aspeed.py: Add an I2C RTC test
28
tests/functional: Introduce a specific test for ast2600 SoC
31
aspeed/i2c: Add ast1030 controller models
29
tests/functional: Introduce a specific test for rainier-bmc machine
32
aspeed/i2c: Enable SLAVE_ADDR_RX_MATCH always
30
tests/functional: Move debian boot test from avocado
33
31
34
Iris Chen (1):
32
Jamin Lin (16):
35
hw: m25p80: fixing individual test failure when tests are running in isolation
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
36
49
37
Joe Komlodi (6):
50
docs/about/deprecated.rst | 8 -
38
hw/registerfields: Add shared fields macros
51
docs/about/removed-features.rst | 10 +
39
aspeed: i2c: Migrate to registerfields API
52
docs/system/arm/aspeed.rst | 1 -
40
aspeed: i2c: Use reg array instead of individual vars
53
include/hw/sd/aspeed_sdhci.h | 13 +-
41
aspeed: i2c: Add new mode support
54
tests/qtest/aspeed-smc-utils.h | 95 ++++
42
aspeed: i2c: Add PKT_DONE IRQ to trace
55
hw/arm/aspeed.c | 28 -
43
aspeed: i2c: Move regs and helpers to header file
56
hw/arm/aspeed_ast2400.c | 3 +-
57
hw/arm/aspeed_ast2600.c | 10 +-
58
hw/arm/aspeed_ast27x0.c | 35 ++
59
hw/sd/aspeed_sdhci.c | 67 ++-
60
tests/qtest/aspeed-smc-utils.c | 686 ++++++++++++++++++++++++
61
tests/qtest/aspeed_smc-test.c | 775 ++++++---------------------
62
tests/qtest/ast2700-smc-test.c | 71 +++
63
tests/avocado/boot_linux_console.py | 26 -
64
tests/functional/aspeed.py | 56 ++
65
tests/functional/meson.build | 13 +-
66
tests/functional/test_arm_aspeed.py | 351 ------------
67
tests/functional/test_arm_aspeed_ast1030.py | 81 +++
68
tests/functional/test_arm_aspeed_ast2500.py | 59 ++
69
tests/functional/test_arm_aspeed_ast2600.py | 143 +++++
70
tests/functional/test_arm_aspeed_palmetto.py | 24 +
71
tests/functional/test_arm_aspeed_rainier.py | 64 +++
72
tests/functional/test_arm_aspeed_romulus.py | 24 +
73
tests/qtest/meson.build | 5 +-
74
24 files changed, 1623 insertions(+), 1025 deletions(-)
75
create mode 100644 tests/qtest/aspeed-smc-utils.h
76
create mode 100644 tests/qtest/aspeed-smc-utils.c
77
create mode 100644 tests/qtest/ast2700-smc-test.c
78
create mode 100644 tests/functional/aspeed.py
79
delete mode 100755 tests/functional/test_arm_aspeed.py
80
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
81
create mode 100644 tests/functional/test_arm_aspeed_ast2500.py
82
create mode 100644 tests/functional/test_arm_aspeed_ast2600.py
83
create mode 100644 tests/functional/test_arm_aspeed_palmetto.py
84
create mode 100644 tests/functional/test_arm_aspeed_rainier.py
85
create mode 100644 tests/functional/test_arm_aspeed_romulus.py
44
86
45
Joel Stanley (1):
46
aspeed/hace: Add missing newlines to unimp messages
47
87
48
Klaus Jensen (2):
49
hw/i2c/aspeed: rework raise interrupt trace event
50
hw/i2c/aspeed: add DEV_ADDR in old register mode
51
52
Troy Lee (1):
53
aspeed: Add I2C buses to AST1030 model
54
55
include/hw/i2c/aspeed_i2c.h | 289 ++++++++++++-
56
include/hw/registerfields.h | 70 +++
57
hw/arm/aspeed.c | 17 +-
58
hw/arm/aspeed_ast10x0.c | 18 +
59
hw/i2c/aspeed_i2c.c | 820 ++++++++++++++++++++++--------------
60
hw/misc/aspeed_hace.c | 4 +-
61
tests/qtest/aspeed_smc-test.c | 74 +++-
62
hw/i2c/trace-events | 2 +-
63
tests/avocado/boot_linux_console.py | 43 --
64
tests/avocado/machine_aspeed.py | 136 ++++++
65
10 files changed, 1095 insertions(+), 378 deletions(-)
66
diff view generated by jsdifflib
1
The board has no such device. It might have been useful for some tests
1
Removal was scheduled for 10.0. Use the rainier-bmc machine or the
2
in the past, it's not anymore and the same can be achieved on the
2
ast2600-evb as a replacement.
3
command line.
4
3
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
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>
6
---
7
---
7
hw/arm/aspeed.c | 4 ----
8
docs/about/deprecated.rst | 8 --------
8
1 file changed, 4 deletions(-)
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(-)
9
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
10
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
66
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
11
index XXXXXXX..XXXXXXX 100644
67
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/aspeed.c
68
--- a/hw/arm/aspeed.c
13
+++ b/hw/arm/aspeed.c
69
+++ b/hw/arm/aspeed.c
14
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
70
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
15
/* The AST2500 EVB expects a LM75 but a TMP105 is compatible */
71
#define AST2700_EVB_HW_STRAP2 0x00000003
16
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 7),
72
#endif
17
TYPE_TMP105, 0x4d);
73
74
-/* Tacoma hardware value */
75
-#define TACOMA_BMC_HW_STRAP1 0x00000000
76
-#define TACOMA_BMC_HW_STRAP2 0x00000040
18
-
77
-
19
- /* The AST2500 EVB does not have an RTC. Let's pretend that one is
78
/* Rainier hardware value: (QEMU prototype) */
20
- * plugged on the I2C bus header */
79
#define RAINIER_BMC_HW_STRAP1 (0x00422016 | SCU_AST2600_HW_STRAP_BOOT_SRC_EMMC)
21
- i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 11), "ds1338", 0x32);
80
#define RAINIER_BMC_HW_STRAP2 0x80000848
22
}
81
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
23
82
aspeed_machine_ast2600_class_emmc_init(oc);
24
static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
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,
25
--
119
--
26
2.35.3
120
2.47.1
27
121
28
122
diff view generated by jsdifflib
New patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
2
3
Fix coding style issues from checkpatch.pl.
4
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Link: https://lore.kernel.org/r/20241204084453.610660-2-jamin_lin@aspeedtech.com
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
---
10
hw/sd/aspeed_sdhci.c | 6 ++++--
11
1 file changed, 4 insertions(+), 2 deletions(-)
12
13
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/sd/aspeed_sdhci.c
16
+++ b/hw/sd/aspeed_sdhci.c
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
18
sdhci->regs[TO_REG(addr)] = (uint32_t)val & ~ASPEED_SDHCI_INFO_RESET;
19
break;
20
case ASPEED_SDHCI_SDIO_140:
21
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 0, 32, val);
22
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
23
+ 0, 32, val);
24
break;
25
case ASPEED_SDHCI_SDIO_144:
26
- sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg, 32, 32, val);
27
+ sdhci->slots[0].capareg = deposit64(sdhci->slots[0].capareg,
28
+ 32, 32, val);
29
break;
30
case ASPEED_SDHCI_SDIO_148:
31
sdhci->slots[0].maxcurr = deposit64(sdhci->slots[0].maxcurr,
32
--
33
2.47.1
34
35
diff view generated by jsdifflib
New patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
2
3
Fix coding style issues from checkpatch.pl.
4
5
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Link: https://lore.kernel.org/r/20241204084453.610660-3-jamin_lin@aspeedtech.com
8
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
---
10
hw/arm/aspeed_ast2600.c | 3 ++-
11
1 file changed, 2 insertions(+), 1 deletion(-)
12
13
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/aspeed_ast2600.c
16
+++ b/hw/arm/aspeed_ast2600.c
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
18
if (!sysbus_realize(SYS_BUS_DEVICE(&s->gpio), errp)) {
19
return;
20
}
21
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0, sc->memmap[ASPEED_DEV_GPIO]);
22
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->gpio), 0,
23
+ sc->memmap[ASPEED_DEV_GPIO]);
24
sysbus_connect_irq(SYS_BUS_DEVICE(&s->gpio), 0,
25
aspeed_soc_get_irq(s, ASPEED_DEV_GPIO));
26
27
--
28
2.47.1
29
30
diff view generated by jsdifflib
1
From: Joe Komlodi <komlodi@google.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Moves register definitions and short commonly used inlined functiosn to
3
Currently, it set the hardcode value of capability registers to all ASPEED SOCs
4
the header file to help tidy up the implementation file.
4
However, the value of capability registers should be different for all ASPEED
5
SOCs. For example: the bit 28 of the Capability Register 1 should be 1 for
6
64-bits System Bus support for AST2700.
5
7
6
Signed-off-by: Joe Komlodi <komlodi@google.com>
8
Introduce a new "capareg" class member whose data type is uint_64 to set the
7
Change-Id: I34dff7485b6bbe3c9482715ccd94dbd65dc5f324
9
different Capability Registers to all ASPEED SOCs.
8
Message-Id: <20220331043248.2237838-8-komlodi@google.com>
10
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
The value of Capability Register is "0x0000000001e80080" for AST2400 and
12
AST2500. The value of Capability Register is "0x0000000701f80080" for AST2600.
13
14
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
15
Reviewed-by: Cédric Le Goater <clg@redhat.com>
16
Link: https://lore.kernel.org/r/20241204084453.610660-4-jamin_lin@aspeedtech.com
17
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
---
18
---
11
include/hw/i2c/aspeed_i2c.h | 267 ++++++++++++++++++++++++++++++++++++
19
include/hw/sd/aspeed_sdhci.h | 12 +++++++--
12
hw/i2c/aspeed_i2c.c | 266 -----------------------------------
20
hw/arm/aspeed_ast2400.c | 3 ++-
13
2 files changed, 267 insertions(+), 266 deletions(-)
21
hw/arm/aspeed_ast2600.c | 7 +++---
22
hw/sd/aspeed_sdhci.c | 47 +++++++++++++++++++++++++++++++++++-
23
4 files changed, 61 insertions(+), 8 deletions(-)
14
24
15
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
25
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
16
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/i2c/aspeed_i2c.h
27
--- a/include/hw/sd/aspeed_sdhci.h
18
+++ b/include/hw/i2c/aspeed_i2c.h
28
+++ b/include/hw/sd/aspeed_sdhci.h
19
@@ -XXX,XX +XXX,XX @@
29
@@ -XXX,XX +XXX,XX @@
20
21
#include "hw/i2c/i2c.h"
22
#include "hw/sysbus.h"
23
+#include "hw/registerfields.h"
24
#include "qom/object.h"
30
#include "qom/object.h"
25
31
26
#define TYPE_ASPEED_I2C "aspeed.i2c"
32
#define TYPE_ASPEED_SDHCI "aspeed.sdhci"
27
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C)
33
-OBJECT_DECLARE_SIMPLE_TYPE(AspeedSDHCIState, ASPEED_SDHCI)
28
#define ASPEED_I2C_OLD_NUM_REG 11
34
+#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
29
#define ASPEED_I2C_NEW_NUM_REG 22
35
+#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
30
36
+#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
31
+/* Tx State Machine */
37
+OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
32
+#define I2CD_TX_STATE_MASK 0xf
38
33
+#define I2CD_IDLE 0x0
39
-#define ASPEED_SDHCI_CAPABILITIES 0x01E80080
34
+#define I2CD_MACTIVE 0x8
40
#define ASPEED_SDHCI_NUM_SLOTS 2
35
+#define I2CD_MSTART 0x9
41
#define ASPEED_SDHCI_NUM_REGS (ASPEED_SDHCI_REG_SIZE / sizeof(uint32_t))
36
+#define I2CD_MSTARTR 0xa
42
#define ASPEED_SDHCI_REG_SIZE 0x100
37
+#define I2CD_MSTOP 0xb
43
@@ -XXX,XX +XXX,XX @@ struct AspeedSDHCIState {
38
+#define I2CD_MTXD 0xc
44
uint32_t regs[ASPEED_SDHCI_NUM_REGS];
39
+#define I2CD_MRXACK 0xd
45
};
40
+#define I2CD_MRXD 0xe
46
41
+#define I2CD_MTXACK 0xf
47
+struct AspeedSDHCIClass {
42
+#define I2CD_SWAIT 0x1
48
+ SysBusDeviceClass parent_class;
43
+#define I2CD_SRXD 0x4
44
+#define I2CD_STXACK 0x5
45
+#define I2CD_STXD 0x6
46
+#define I2CD_SRXACK 0x7
47
+#define I2CD_RECOVER 0x3
48
+
49
+
49
+/* I2C Global Register */
50
+ uint64_t capareg;
50
+REG32(I2C_CTRL_STATUS, 0x0) /* Device Interrupt Status */
51
+};
51
+REG32(I2C_CTRL_ASSIGN, 0x8) /* Device Interrupt Target Assignment */
52
+REG32(I2C_CTRL_GLOBAL, 0xC) /* Global Control Register */
53
+ FIELD(I2C_CTRL_GLOBAL, REG_MODE, 2, 1)
54
+ FIELD(I2C_CTRL_GLOBAL, SRAM_EN, 0, 1)
55
+REG32(I2C_CTRL_NEW_CLK_DIVIDER, 0x10) /* New mode clock divider */
56
+
52
+
57
+/* I2C Old Mode Device (Bus) Register */
53
#endif /* ASPEED_SDHCI_H */
58
+REG32(I2CD_FUN_CTRL, 0x0) /* I2CD Function Control */
54
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
59
+ FIELD(I2CD_FUN_CTRL, POOL_PAGE_SEL, 20, 3) /* AST2400 */
55
index XXXXXXX..XXXXXXX 100644
60
+ SHARED_FIELD(M_SDA_LOCK_EN, 16, 1)
56
--- a/hw/arm/aspeed_ast2400.c
61
+ SHARED_FIELD(MULTI_MASTER_DIS, 15, 1)
57
+++ b/hw/arm/aspeed_ast2400.c
62
+ SHARED_FIELD(M_SCL_DRIVE_EN, 14, 1)
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
63
+ SHARED_FIELD(MSB_STS, 9, 1)
59
snprintf(typename, sizeof(typename), "aspeed.gpio-%s", socname);
64
+ SHARED_FIELD(SDA_DRIVE_IT_EN, 8, 1)
60
object_initialize_child(obj, "gpio", &s->gpio, typename);
65
+ SHARED_FIELD(M_SDA_DRIVE_IT_EN, 7, 1)
61
66
+ SHARED_FIELD(M_HIGH_SPEED_EN, 6, 1)
62
- object_initialize_child(obj, "sdc", &s->sdhci, TYPE_ASPEED_SDHCI);
67
+ SHARED_FIELD(DEF_ADDR_EN, 5, 1)
63
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
68
+ SHARED_FIELD(DEF_ALERT_EN, 4, 1)
64
+ object_initialize_child(obj, "sdc", &s->sdhci, typename);
69
+ SHARED_FIELD(DEF_ARP_EN, 3, 1)
65
70
+ SHARED_FIELD(DEF_GCALL_EN, 2, 1)
66
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
71
+ SHARED_FIELD(SLAVE_EN, 1, 1)
67
72
+ SHARED_FIELD(MASTER_EN, 0, 1)
68
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
73
+REG32(I2CD_AC_TIMING1, 0x04) /* Clock and AC Timing Control #1 */
69
index XXXXXXX..XXXXXXX 100644
74
+REG32(I2CD_AC_TIMING2, 0x08) /* Clock and AC Timing Control #2 */
70
--- a/hw/arm/aspeed_ast2600.c
75
+REG32(I2CD_INTR_CTRL, 0x0C) /* I2CD Interrupt Control */
71
+++ b/hw/arm/aspeed_ast2600.c
76
+REG32(I2CD_INTR_STS, 0x10) /* I2CD Interrupt Status */
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
77
+ SHARED_FIELD(SLAVE_ADDR_MATCH, 31, 1) /* 0: addr1 1: addr2 */
73
snprintf(typename, sizeof(typename), "aspeed.gpio-%s-1_8v", socname);
78
+ SHARED_FIELD(SLAVE_ADDR_RX_PENDING, 29, 1)
74
object_initialize_child(obj, "gpio_1_8v", &s->gpio_1_8v, typename);
79
+ SHARED_FIELD(SLAVE_INACTIVE_TIMEOUT, 15, 1)
75
80
+ SHARED_FIELD(SDA_DL_TIMEOUT, 14, 1)
76
- object_initialize_child(obj, "sd-controller", &s->sdhci,
81
+ SHARED_FIELD(BUS_RECOVER_DONE, 13, 1)
77
- TYPE_ASPEED_SDHCI);
82
+ SHARED_FIELD(SMBUS_ALERT, 12, 1) /* Bus [0-3] only */
78
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
83
+ FIELD(I2CD_INTR_STS, SMBUS_ARP_ADDR, 11, 1) /* Removed */
79
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
84
+ FIELD(I2CD_INTR_STS, SMBUS_DEV_ALERT_ADDR, 10, 1) /* Removed */
80
85
+ FIELD(I2CD_INTR_STS, SMBUS_DEF_ADDR, 9, 1) /* Removed */
81
object_property_set_int(OBJECT(&s->sdhci), "num-slots", 2, &error_abort);
86
+ FIELD(I2CD_INTR_STS, GCALL_ADDR, 8, 1) /* Removed */
82
87
+ FIELD(I2CD_INTR_STS, SLAVE_ADDR_RX_MATCH, 7, 1) /* use RX_DONE */
83
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
88
+ SHARED_FIELD(SCL_TIMEOUT, 6, 1)
84
&s->sdhci.slots[i], TYPE_SYSBUS_SDHCI);
89
+ SHARED_FIELD(ABNORMAL, 5, 1)
85
}
90
+ SHARED_FIELD(NORMAL_STOP, 4, 1)
86
91
+ SHARED_FIELD(ARBIT_LOSS, 3, 1)
87
- object_initialize_child(obj, "emmc-controller", &s->emmc,
92
+ SHARED_FIELD(RX_DONE, 2, 1)
88
- TYPE_ASPEED_SDHCI);
93
+ SHARED_FIELD(TX_NAK, 1, 1)
89
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
94
+ SHARED_FIELD(TX_ACK, 0, 1)
90
95
+REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
91
object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
96
+ SHARED_FIELD(SDA_OE, 28, 1)
92
97
+ SHARED_FIELD(SDA_O, 27, 1)
93
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
98
+ SHARED_FIELD(SCL_OE, 26, 1)
94
index XXXXXXX..XXXXXXX 100644
99
+ SHARED_FIELD(SCL_O, 25, 1)
95
--- a/hw/sd/aspeed_sdhci.c
100
+ SHARED_FIELD(TX_TIMING, 23, 2)
96
+++ b/hw/sd/aspeed_sdhci.c
101
+ SHARED_FIELD(TX_STATE, 19, 4)
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
102
+ SHARED_FIELD(SCL_LINE_STS, 18, 1)
98
{
103
+ SHARED_FIELD(SDA_LINE_STS, 17, 1)
99
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
104
+ SHARED_FIELD(BUS_BUSY_STS, 16, 1)
100
AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
105
+ SHARED_FIELD(SDA_OE_OUT_DIR, 15, 1)
101
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_GET_CLASS(sdhci);
106
+ SHARED_FIELD(SDA_O_OUT_DIR, 14, 1)
102
107
+ SHARED_FIELD(SCL_OE_OUT_DIR, 13, 1)
103
/* Create input irqs for the slots */
108
+ SHARED_FIELD(SCL_O_OUT_DIR, 12, 1)
104
qdev_init_gpio_in_named_with_opaque(DEVICE(sbd), aspeed_sdhci_set_irq,
109
+ SHARED_FIELD(BUS_RECOVER_CMD_EN, 11, 1)
105
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_realize(DeviceState *dev, Error **errp)
110
+ SHARED_FIELD(S_ALT_EN, 10, 1)
106
}
111
+ /* Command Bits */
107
112
+ SHARED_FIELD(RX_DMA_EN, 9, 1)
108
if (!object_property_set_uint(sdhci_slot, "capareg",
113
+ SHARED_FIELD(TX_DMA_EN, 8, 1)
109
- ASPEED_SDHCI_CAPABILITIES, errp)) {
114
+ SHARED_FIELD(RX_BUFF_EN, 7, 1)
110
+ asc->capareg, errp)) {
115
+ SHARED_FIELD(TX_BUFF_EN, 6, 1)
111
return;
116
+ SHARED_FIELD(M_STOP_CMD, 5, 1)
112
}
117
+ SHARED_FIELD(M_S_RX_CMD_LAST, 4, 1)
113
118
+ SHARED_FIELD(M_RX_CMD, 3, 1)
114
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_class_init(ObjectClass *classp, void *data)
119
+ SHARED_FIELD(S_TX_CMD, 2, 1)
115
device_class_set_props(dc, aspeed_sdhci_properties);
120
+ SHARED_FIELD(M_TX_CMD, 1, 1)
116
}
121
+ SHARED_FIELD(M_START_CMD, 0, 1)
117
122
+REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
118
+static void aspeed_2400_sdhci_class_init(ObjectClass *klass, void *data)
123
+REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
119
+{
124
+ SHARED_FIELD(RX_COUNT, 24, 5)
120
+ DeviceClass *dc = DEVICE_CLASS(klass);
125
+ SHARED_FIELD(RX_SIZE, 16, 5)
121
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
126
+ SHARED_FIELD(TX_COUNT, 9, 5)
127
+ FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
128
+REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
129
+ SHARED_FIELD(RX_BUF, 8, 8)
130
+ SHARED_FIELD(TX_BUF, 0, 8)
131
+REG32(I2CD_DMA_ADDR, 0x24) /* DMA Buffer Address */
132
+REG32(I2CD_DMA_LEN, 0x28) /* DMA Transfer Length < 4KB */
133
+
122
+
134
+/* I2C New Mode Device (Bus) Register */
123
+ dc->desc = "ASPEED 2400 SDHCI Controller";
135
+REG32(I2CC_FUN_CTRL, 0x0)
124
+ asc->capareg = 0x0000000001e80080;
136
+ FIELD(I2CC_FUN_CTRL, RB_EARLY_DONE_EN, 22, 1)
137
+ FIELD(I2CC_FUN_CTRL, DMA_DIS_AUTO_RECOVER, 21, 1)
138
+ FIELD(I2CC_FUN_CTRL, S_SAVE_ADDR, 20, 1)
139
+ FIELD(I2CC_FUN_CTRL, M_PKT_RETRY_CNT, 18, 2)
140
+ /* 17:0 shared with I2CD_FUN_CTRL[17:0] */
141
+REG32(I2CC_AC_TIMING, 0x04)
142
+REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
143
+ /* 31:16 shared with I2CD_CMD[31:16] */
144
+ /* 15:0 shared with I2CD_BYTE_BUF[15:0] */
145
+REG32(I2CC_POOL_CTRL, 0x0c)
146
+ /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
147
+REG32(I2CM_INTR_CTRL, 0x10)
148
+REG32(I2CM_INTR_STS, 0x14)
149
+ FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)
150
+ FIELD(I2CM_INTR_STS, PKT_CMD_TIMEOUT, 18, 1)
151
+ FIELD(I2CM_INTR_STS, PKT_CMD_FAIL, 17, 1)
152
+ FIELD(I2CM_INTR_STS, PKT_CMD_DONE, 16, 1)
153
+ FIELD(I2CM_INTR_STS, BUS_RECOVER_FAIL, 15, 1)
154
+ /* 14:0 shared with I2CD_INTR_STS[14:0] */
155
+REG32(I2CM_CMD, 0x18)
156
+ FIELD(I2CM_CMD, W1_CTRL, 31, 1)
157
+ FIELD(I2CM_CMD, PKT_DEV_ADDR, 24, 7)
158
+ FIELD(I2CM_CMD, HS_MASTER_MODE_LSB, 17, 3)
159
+ FIELD(I2CM_CMD, PKT_OP_EN, 16, 1)
160
+ /* 15:0 shared with I2CD_CMD[15:0] */
161
+REG32(I2CM_DMA_LEN, 0x1c)
162
+ FIELD(I2CM_DMA_LEN, RX_BUF_LEN_W1T, 31, 1)
163
+ FIELD(I2CM_DMA_LEN, RX_BUF_LEN, 16, 11)
164
+ FIELD(I2CM_DMA_LEN, TX_BUF_LEN_W1T, 15, 1)
165
+ FIELD(I2CM_DMA_LEN, TX_BUF_LEN, 0, 11)
166
+REG32(I2CS_INTR_CTRL, 0x20)
167
+REG32(I2CS_INTR_STS, 0x24)
168
+ /* 31:29 shared with I2CD_INTR_STS[31:29] */
169
+ FIELD(I2CS_INTR_STS, SLAVE_PARKING_STS, 24, 2)
170
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR3_NAK, 22, 1)
171
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR2_NAK, 21, 1)
172
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR1_NAK, 20, 1)
173
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR_INDICATOR, 18, 2)
174
+ FIELD(I2CS_INTR_STS, PKT_CMD_FAIL, 17, 1)
175
+ FIELD(I2CS_INTR_STS, PKT_CMD_DONE, 16, 1)
176
+ /* 14:0 shared with I2CD_INTR_STS[14:0] */
177
+REG32(I2CS_CMD, 0x28)
178
+ FIELD(I2CS_CMD, W1_CTRL, 31, 1)
179
+ FIELD(I2CS_CMD, PKT_MODE_ACTIVE_ADDR, 17, 2)
180
+ FIELD(I2CS_CMD, PKT_MODE_EN, 16, 1)
181
+ FIELD(I2CS_CMD, AUTO_NAK_INACTIVE_ADDR, 15, 1)
182
+ FIELD(I2CS_CMD, AUTO_NAK_ACTIVE_ADDR, 14, 1)
183
+ /* 13:0 shared with I2CD_CMD[13:0] */
184
+REG32(I2CS_DMA_LEN, 0x2c)
185
+ FIELD(I2CS_DMA_LEN, RX_BUF_LEN_W1T, 31, 1)
186
+ FIELD(I2CS_DMA_LEN, RX_BUF_LEN, 16, 11)
187
+ FIELD(I2CS_DMA_LEN, TX_BUF_LEN_W1T, 15, 1)
188
+ FIELD(I2CS_DMA_LEN, TX_BUF_LEN, 0, 11)
189
+REG32(I2CM_DMA_TX_ADDR, 0x30)
190
+ FIELD(I2CM_DMA_TX_ADDR, ADDR, 0, 31)
191
+REG32(I2CM_DMA_RX_ADDR, 0x34)
192
+ FIELD(I2CM_DMA_RX_ADDR, ADDR, 0, 31)
193
+REG32(I2CS_DMA_TX_ADDR, 0x38)
194
+ FIELD(I2CS_DMA_TX_ADDR, ADDR, 0, 31)
195
+REG32(I2CS_DMA_RX_ADDR, 0x3c)
196
+ FIELD(I2CS_DMA_RX_ADDR, ADDR, 0, 31)
197
+REG32(I2CS_DEV_ADDR, 0x40)
198
+REG32(I2CM_DMA_LEN_STS, 0x48)
199
+ FIELD(I2CM_DMA_LEN_STS, RX_LEN, 16, 13)
200
+ FIELD(I2CM_DMA_LEN_STS, TX_LEN, 0, 13)
201
+REG32(I2CS_DMA_LEN_STS, 0x4c)
202
+ FIELD(I2CS_DMA_LEN_STS, RX_LEN, 16, 13)
203
+ FIELD(I2CS_DMA_LEN_STS, TX_LEN, 0, 13)
204
+REG32(I2CC_DMA_ADDR, 0x50)
205
+REG32(I2CC_DMA_LEN, 0x54)
206
+
207
struct AspeedI2CState;
208
209
#define TYPE_ASPEED_I2C_BUS "aspeed.i2c.bus"
210
@@ -XXX,XX +XXX,XX @@ struct AspeedI2CClass {
211
212
};
213
214
+static inline bool aspeed_i2c_is_new_mode(AspeedI2CState *s)
215
+{
216
+ return FIELD_EX32(s->ctrl_global, I2C_CTRL_GLOBAL, REG_MODE);
217
+}
125
+}
218
+
126
+
219
+static inline bool aspeed_i2c_bus_pkt_mode_en(AspeedI2CBus *bus)
127
+static void aspeed_2500_sdhci_class_init(ObjectClass *klass, void *data)
220
+{
128
+{
221
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
222
+ return ARRAY_FIELD_EX32(bus->regs, I2CM_CMD, PKT_OP_EN);
130
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
223
+ }
131
+
224
+ return false;
132
+ dc->desc = "ASPEED 2500 SDHCI Controller";
133
+ asc->capareg = 0x0000000001e80080;
225
+}
134
+}
226
+
135
+
227
+static inline uint32_t aspeed_i2c_bus_ctrl_offset(AspeedI2CBus *bus)
136
+static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
228
+{
137
+{
229
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
230
+ return R_I2CC_FUN_CTRL;
139
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
231
+ }
140
+
232
+ return R_I2CD_FUN_CTRL;
141
+ dc->desc = "ASPEED 2600 SDHCI Controller";
142
+ asc->capareg = 0x0000000701f80080;
233
+}
143
+}
234
+
144
+
235
+static inline uint32_t aspeed_i2c_bus_cmd_offset(AspeedI2CBus *bus)
145
static const TypeInfo aspeed_sdhci_types[] = {
236
+{
146
{
237
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
147
.name = TYPE_ASPEED_SDHCI,
238
+ return R_I2CM_CMD;
148
.parent = TYPE_SYS_BUS_DEVICE,
239
+ }
149
.instance_size = sizeof(AspeedSDHCIState),
240
+ return R_I2CD_CMD;
150
.class_init = aspeed_sdhci_class_init,
241
+}
151
+ .class_size = sizeof(AspeedSDHCIClass),
242
+
152
+ .abstract = true,
243
+static inline uint32_t aspeed_i2c_bus_intr_ctrl_offset(AspeedI2CBus *bus)
153
+ },
244
+{
154
+ {
245
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
155
+ .name = TYPE_ASPEED_2400_SDHCI,
246
+ return R_I2CM_INTR_CTRL;
156
+ .parent = TYPE_ASPEED_SDHCI,
247
+ }
157
+ .class_init = aspeed_2400_sdhci_class_init,
248
+ return R_I2CD_INTR_CTRL;
158
+ },
249
+}
159
+ {
250
+
160
+ .name = TYPE_ASPEED_2500_SDHCI,
251
+static inline uint32_t aspeed_i2c_bus_intr_sts_offset(AspeedI2CBus *bus)
161
+ .parent = TYPE_ASPEED_SDHCI,
252
+{
162
+ .class_init = aspeed_2500_sdhci_class_init,
253
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
163
+ },
254
+ return R_I2CM_INTR_STS;
164
+ {
255
+ }
165
+ .name = TYPE_ASPEED_2600_SDHCI,
256
+ return R_I2CD_INTR_STS;
166
+ .parent = TYPE_ASPEED_SDHCI,
257
+}
167
+ .class_init = aspeed_2600_sdhci_class_init,
258
+
168
},
259
+static inline uint32_t aspeed_i2c_bus_pool_ctrl_offset(AspeedI2CBus *bus)
169
};
260
+{
170
261
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
262
+ return R_I2CC_POOL_CTRL;
263
+ }
264
+ return R_I2CD_POOL_CTRL;
265
+}
266
+
267
+static inline uint32_t aspeed_i2c_bus_byte_buf_offset(AspeedI2CBus *bus)
268
+{
269
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
270
+ return R_I2CC_MS_TXRX_BYTE_BUF;
271
+ }
272
+ return R_I2CD_BYTE_BUF;
273
+}
274
+
275
+static inline uint32_t aspeed_i2c_bus_dma_len_offset(AspeedI2CBus *bus)
276
+{
277
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
278
+ return R_I2CC_DMA_LEN;
279
+ }
280
+ return R_I2CD_DMA_LEN;
281
+}
282
+
283
+static inline uint32_t aspeed_i2c_bus_dma_addr_offset(AspeedI2CBus *bus)
284
+{
285
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
286
+ return R_I2CC_DMA_ADDR;
287
+ }
288
+ return R_I2CD_DMA_ADDR;
289
+}
290
+
291
+static inline bool aspeed_i2c_bus_is_master(AspeedI2CBus *bus)
292
+{
293
+ return SHARED_ARRAY_FIELD_EX32(bus->regs, aspeed_i2c_bus_ctrl_offset(bus),
294
+ MASTER_EN);
295
+}
296
+
297
+static inline bool aspeed_i2c_bus_is_enabled(AspeedI2CBus *bus)
298
+{
299
+ uint32_t ctrl_reg = aspeed_i2c_bus_ctrl_offset(bus);
300
+ return SHARED_ARRAY_FIELD_EX32(bus->regs, ctrl_reg, MASTER_EN) ||
301
+ SHARED_ARRAY_FIELD_EX32(bus->regs, ctrl_reg, SLAVE_EN);
302
+}
303
+
304
I2CBus *aspeed_i2c_get_bus(AspeedI2CState *s, int busnr);
305
306
#endif /* ASPEED_I2C_H */
307
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
308
index XXXXXXX..XXXXXXX 100644
309
--- a/hw/i2c/aspeed_i2c.c
310
+++ b/hw/i2c/aspeed_i2c.c
311
@@ -XXX,XX +XXX,XX @@
312
#include "hw/registerfields.h"
313
#include "trace.h"
314
315
-/* Tx State Machine */
316
-#define I2CD_TX_STATE_MASK 0xf
317
-#define I2CD_IDLE 0x0
318
-#define I2CD_MACTIVE 0x8
319
-#define I2CD_MSTART 0x9
320
-#define I2CD_MSTARTR 0xa
321
-#define I2CD_MSTOP 0xb
322
-#define I2CD_MTXD 0xc
323
-#define I2CD_MRXACK 0xd
324
-#define I2CD_MRXD 0xe
325
-#define I2CD_MTXACK 0xf
326
-#define I2CD_SWAIT 0x1
327
-#define I2CD_SRXD 0x4
328
-#define I2CD_STXACK 0x5
329
-#define I2CD_STXD 0x6
330
-#define I2CD_SRXACK 0x7
331
-#define I2CD_RECOVER 0x3
332
-
333
-/* I2C Global Register */
334
-REG32(I2C_CTRL_STATUS, 0x0) /* Device Interrupt Status */
335
-REG32(I2C_CTRL_ASSIGN, 0x8) /* Device Interrupt Target Assignment */
336
-REG32(I2C_CTRL_GLOBAL, 0xC) /* Global Control Register */
337
- FIELD(I2C_CTRL_GLOBAL, REG_MODE, 2, 1)
338
- FIELD(I2C_CTRL_GLOBAL, SRAM_EN, 0, 1)
339
-REG32(I2C_CTRL_NEW_CLK_DIVIDER, 0x10) /* New mode clock divider */
340
-
341
-/* I2C Old Mode Device (Bus) Register */
342
-REG32(I2CD_FUN_CTRL, 0x0) /* I2CD Function Control */
343
- FIELD(I2CD_FUN_CTRL, POOL_PAGE_SEL, 20, 3) /* AST2400 */
344
- SHARED_FIELD(M_SDA_LOCK_EN, 16, 1)
345
- SHARED_FIELD(MULTI_MASTER_DIS, 15, 1)
346
- SHARED_FIELD(M_SCL_DRIVE_EN, 14, 1)
347
- SHARED_FIELD(MSB_STS, 9, 1)
348
- SHARED_FIELD(SDA_DRIVE_IT_EN, 8, 1)
349
- SHARED_FIELD(M_SDA_DRIVE_IT_EN, 7, 1)
350
- SHARED_FIELD(M_HIGH_SPEED_EN, 6, 1)
351
- SHARED_FIELD(DEF_ADDR_EN, 5, 1)
352
- SHARED_FIELD(DEF_ALERT_EN, 4, 1)
353
- SHARED_FIELD(DEF_ARP_EN, 3, 1)
354
- SHARED_FIELD(DEF_GCALL_EN, 2, 1)
355
- SHARED_FIELD(SLAVE_EN, 1, 1)
356
- SHARED_FIELD(MASTER_EN, 0, 1)
357
-REG32(I2CD_AC_TIMING1, 0x04) /* Clock and AC Timing Control #1 */
358
-REG32(I2CD_AC_TIMING2, 0x08) /* Clock and AC Timing Control #2 */
359
-REG32(I2CD_INTR_CTRL, 0x0C) /* I2CD Interrupt Control */
360
-REG32(I2CD_INTR_STS, 0x10) /* I2CD Interrupt Status */
361
- SHARED_FIELD(SLAVE_ADDR_MATCH, 31, 1) /* 0: addr1 1: addr2 */
362
- SHARED_FIELD(SLAVE_ADDR_RX_PENDING, 29, 1)
363
- SHARED_FIELD(SLAVE_INACTIVE_TIMEOUT, 15, 1)
364
- SHARED_FIELD(SDA_DL_TIMEOUT, 14, 1)
365
- SHARED_FIELD(BUS_RECOVER_DONE, 13, 1)
366
- SHARED_FIELD(SMBUS_ALERT, 12, 1) /* Bus [0-3] only */
367
- FIELD(I2CD_INTR_STS, SMBUS_ARP_ADDR, 11, 1) /* Removed */
368
- FIELD(I2CD_INTR_STS, SMBUS_DEV_ALERT_ADDR, 10, 1) /* Removed */
369
- FIELD(I2CD_INTR_STS, SMBUS_DEF_ADDR, 9, 1) /* Removed */
370
- FIELD(I2CD_INTR_STS, GCALL_ADDR, 8, 1) /* Removed */
371
- FIELD(I2CD_INTR_STS, SLAVE_ADDR_RX_MATCH, 7, 1) /* use RX_DONE */
372
- SHARED_FIELD(SCL_TIMEOUT, 6, 1)
373
- SHARED_FIELD(ABNORMAL, 5, 1)
374
- SHARED_FIELD(NORMAL_STOP, 4, 1)
375
- SHARED_FIELD(ARBIT_LOSS, 3, 1)
376
- SHARED_FIELD(RX_DONE, 2, 1)
377
- SHARED_FIELD(TX_NAK, 1, 1)
378
- SHARED_FIELD(TX_ACK, 0, 1)
379
-REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
380
- SHARED_FIELD(SDA_OE, 28, 1)
381
- SHARED_FIELD(SDA_O, 27, 1)
382
- SHARED_FIELD(SCL_OE, 26, 1)
383
- SHARED_FIELD(SCL_O, 25, 1)
384
- SHARED_FIELD(TX_TIMING, 23, 2)
385
- SHARED_FIELD(TX_STATE, 19, 4)
386
- SHARED_FIELD(SCL_LINE_STS, 18, 1)
387
- SHARED_FIELD(SDA_LINE_STS, 17, 1)
388
- SHARED_FIELD(BUS_BUSY_STS, 16, 1)
389
- SHARED_FIELD(SDA_OE_OUT_DIR, 15, 1)
390
- SHARED_FIELD(SDA_O_OUT_DIR, 14, 1)
391
- SHARED_FIELD(SCL_OE_OUT_DIR, 13, 1)
392
- SHARED_FIELD(SCL_O_OUT_DIR, 12, 1)
393
- SHARED_FIELD(BUS_RECOVER_CMD_EN, 11, 1)
394
- SHARED_FIELD(S_ALT_EN, 10, 1)
395
- /* Command Bits */
396
- SHARED_FIELD(RX_DMA_EN, 9, 1)
397
- SHARED_FIELD(TX_DMA_EN, 8, 1)
398
- SHARED_FIELD(RX_BUFF_EN, 7, 1)
399
- SHARED_FIELD(TX_BUFF_EN, 6, 1)
400
- SHARED_FIELD(M_STOP_CMD, 5, 1)
401
- SHARED_FIELD(M_S_RX_CMD_LAST, 4, 1)
402
- SHARED_FIELD(M_RX_CMD, 3, 1)
403
- SHARED_FIELD(S_TX_CMD, 2, 1)
404
- SHARED_FIELD(M_TX_CMD, 1, 1)
405
- SHARED_FIELD(M_START_CMD, 0, 1)
406
-REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
407
-REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
408
- SHARED_FIELD(RX_COUNT, 24, 5)
409
- SHARED_FIELD(RX_SIZE, 16, 5)
410
- SHARED_FIELD(TX_COUNT, 9, 5)
411
- FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
412
-REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
413
- SHARED_FIELD(RX_BUF, 8, 8)
414
- SHARED_FIELD(TX_BUF, 0, 8)
415
-REG32(I2CD_DMA_ADDR, 0x24) /* DMA Buffer Address */
416
-REG32(I2CD_DMA_LEN, 0x28) /* DMA Transfer Length < 4KB */
417
-
418
-/* I2C New Mode Device (Bus) Register */
419
-REG32(I2CC_FUN_CTRL, 0x0)
420
- FIELD(I2CC_FUN_CTRL, RB_EARLY_DONE_EN, 22, 1)
421
- FIELD(I2CC_FUN_CTRL, DMA_DIS_AUTO_RECOVER, 21, 1)
422
- FIELD(I2CC_FUN_CTRL, S_SAVE_ADDR, 20, 1)
423
- FIELD(I2CC_FUN_CTRL, M_PKT_RETRY_CNT, 18, 2)
424
- /* 17:0 shared with I2CD_FUN_CTRL[17:0] */
425
-REG32(I2CC_AC_TIMING, 0x04)
426
-REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
427
- /* 31:16 shared with I2CD_CMD[31:16] */
428
- /* 15:0 shared with I2CD_BYTE_BUF[15:0] */
429
-REG32(I2CC_POOL_CTRL, 0x0c)
430
- /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
431
-REG32(I2CM_INTR_CTRL, 0x10)
432
-REG32(I2CM_INTR_STS, 0x14)
433
- FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)
434
- FIELD(I2CM_INTR_STS, PKT_CMD_TIMEOUT, 18, 1)
435
- FIELD(I2CM_INTR_STS, PKT_CMD_FAIL, 17, 1)
436
- FIELD(I2CM_INTR_STS, PKT_CMD_DONE, 16, 1)
437
- FIELD(I2CM_INTR_STS, BUS_RECOVER_FAIL, 15, 1)
438
- /* 14:0 shared with I2CD_INTR_STS[14:0] */
439
-REG32(I2CM_CMD, 0x18)
440
- FIELD(I2CM_CMD, W1_CTRL, 31, 1)
441
- FIELD(I2CM_CMD, PKT_DEV_ADDR, 24, 7)
442
- FIELD(I2CM_CMD, HS_MASTER_MODE_LSB, 17, 3)
443
- FIELD(I2CM_CMD, PKT_OP_EN, 16, 1)
444
- /* 15:0 shared with I2CD_CMD[15:0] */
445
-REG32(I2CM_DMA_LEN, 0x1c)
446
- FIELD(I2CM_DMA_LEN, RX_BUF_LEN_W1T, 31, 1)
447
- FIELD(I2CM_DMA_LEN, RX_BUF_LEN, 16, 11)
448
- FIELD(I2CM_DMA_LEN, TX_BUF_LEN_W1T, 15, 1)
449
- FIELD(I2CM_DMA_LEN, TX_BUF_LEN, 0, 11)
450
-REG32(I2CS_INTR_CTRL, 0x20)
451
-REG32(I2CS_INTR_STS, 0x24)
452
- /* 31:29 shared with I2CD_INTR_STS[31:29] */
453
- FIELD(I2CS_INTR_STS, SLAVE_PARKING_STS, 24, 2)
454
- FIELD(I2CS_INTR_STS, SLAVE_ADDR3_NAK, 22, 1)
455
- FIELD(I2CS_INTR_STS, SLAVE_ADDR2_NAK, 21, 1)
456
- FIELD(I2CS_INTR_STS, SLAVE_ADDR1_NAK, 20, 1)
457
- FIELD(I2CS_INTR_STS, SLAVE_ADDR_INDICATOR, 18, 2)
458
- FIELD(I2CS_INTR_STS, PKT_CMD_FAIL, 17, 1)
459
- FIELD(I2CS_INTR_STS, PKT_CMD_DONE, 16, 1)
460
- /* 14:0 shared with I2CD_INTR_STS[14:0] */
461
-REG32(I2CS_CMD, 0x28)
462
- FIELD(I2CS_CMD, W1_CTRL, 31, 1)
463
- FIELD(I2CS_CMD, PKT_MODE_ACTIVE_ADDR, 17, 2)
464
- FIELD(I2CS_CMD, PKT_MODE_EN, 16, 1)
465
- FIELD(I2CS_CMD, AUTO_NAK_INACTIVE_ADDR, 15, 1)
466
- FIELD(I2CS_CMD, AUTO_NAK_ACTIVE_ADDR, 14, 1)
467
- /* 13:0 shared with I2CD_CMD[13:0] */
468
-REG32(I2CS_DMA_LEN, 0x2c)
469
- FIELD(I2CS_DMA_LEN, RX_BUF_LEN_W1T, 31, 1)
470
- FIELD(I2CS_DMA_LEN, RX_BUF_LEN, 16, 11)
471
- FIELD(I2CS_DMA_LEN, TX_BUF_LEN_W1T, 15, 1)
472
- FIELD(I2CS_DMA_LEN, TX_BUF_LEN, 0, 11)
473
-REG32(I2CM_DMA_TX_ADDR, 0x30)
474
- FIELD(I2CM_DMA_TX_ADDR, ADDR, 0, 31)
475
-REG32(I2CM_DMA_RX_ADDR, 0x34)
476
- FIELD(I2CM_DMA_RX_ADDR, ADDR, 0, 31)
477
-REG32(I2CS_DMA_TX_ADDR, 0x38)
478
- FIELD(I2CS_DMA_TX_ADDR, ADDR, 0, 31)
479
-REG32(I2CS_DMA_RX_ADDR, 0x3c)
480
- FIELD(I2CS_DMA_RX_ADDR, ADDR, 0, 31)
481
-REG32(I2CS_DEV_ADDR, 0x40)
482
-REG32(I2CM_DMA_LEN_STS, 0x48)
483
- FIELD(I2CM_DMA_LEN_STS, RX_LEN, 16, 13)
484
- FIELD(I2CM_DMA_LEN_STS, TX_LEN, 0, 13)
485
-REG32(I2CS_DMA_LEN_STS, 0x4c)
486
- FIELD(I2CS_DMA_LEN_STS, RX_LEN, 16, 13)
487
- FIELD(I2CS_DMA_LEN_STS, TX_LEN, 0, 13)
488
-REG32(I2CC_DMA_ADDR, 0x50)
489
-REG32(I2CC_DMA_LEN, 0x54)
490
-
491
-static inline bool aspeed_i2c_is_new_mode(AspeedI2CState *s)
492
-{
493
- return FIELD_EX32(s->ctrl_global, I2C_CTRL_GLOBAL, REG_MODE);
494
-}
495
-
496
-static inline bool aspeed_i2c_bus_pkt_mode_en(AspeedI2CBus *bus)
497
-{
498
- if (aspeed_i2c_is_new_mode(bus->controller)) {
499
- return ARRAY_FIELD_EX32(bus->regs, I2CM_CMD, PKT_OP_EN);
500
- }
501
- return false;
502
-}
503
-
504
-static inline uint32_t aspeed_i2c_bus_ctrl_offset(AspeedI2CBus *bus)
505
-{
506
- if (aspeed_i2c_is_new_mode(bus->controller)) {
507
- return R_I2CC_FUN_CTRL;
508
- }
509
- return R_I2CD_FUN_CTRL;
510
-}
511
-
512
-static inline uint32_t aspeed_i2c_bus_cmd_offset(AspeedI2CBus *bus)
513
-{
514
- if (aspeed_i2c_is_new_mode(bus->controller)) {
515
- return R_I2CM_CMD;
516
- }
517
- return R_I2CD_CMD;
518
-}
519
-
520
-static inline uint32_t aspeed_i2c_bus_intr_ctrl_offset(AspeedI2CBus *bus)
521
-{
522
- if (aspeed_i2c_is_new_mode(bus->controller)) {
523
- return R_I2CM_INTR_CTRL;
524
- }
525
- return R_I2CD_INTR_CTRL;
526
-}
527
-
528
-static inline uint32_t aspeed_i2c_bus_intr_sts_offset(AspeedI2CBus *bus)
529
-{
530
- if (aspeed_i2c_is_new_mode(bus->controller)) {
531
- return R_I2CM_INTR_STS;
532
- }
533
- return R_I2CD_INTR_STS;
534
-}
535
-
536
-static inline uint32_t aspeed_i2c_bus_pool_ctrl_offset(AspeedI2CBus *bus)
537
-{
538
- if (aspeed_i2c_is_new_mode(bus->controller)) {
539
- return R_I2CC_POOL_CTRL;
540
- }
541
- return R_I2CD_POOL_CTRL;
542
-}
543
-
544
-static inline uint32_t aspeed_i2c_bus_byte_buf_offset(AspeedI2CBus *bus)
545
-{
546
- if (aspeed_i2c_is_new_mode(bus->controller)) {
547
- return R_I2CC_MS_TXRX_BYTE_BUF;
548
- }
549
- return R_I2CD_BYTE_BUF;
550
-}
551
-
552
-static inline uint32_t aspeed_i2c_bus_dma_len_offset(AspeedI2CBus *bus)
553
-{
554
- if (aspeed_i2c_is_new_mode(bus->controller)) {
555
- return R_I2CC_DMA_LEN;
556
- }
557
- return R_I2CD_DMA_LEN;
558
-}
559
-
560
-static inline uint32_t aspeed_i2c_bus_dma_addr_offset(AspeedI2CBus *bus)
561
-{
562
- if (aspeed_i2c_is_new_mode(bus->controller)) {
563
- return R_I2CC_DMA_ADDR;
564
- }
565
- return R_I2CD_DMA_ADDR;
566
-}
567
-
568
-static inline bool aspeed_i2c_bus_is_master(AspeedI2CBus *bus)
569
-{
570
- return SHARED_ARRAY_FIELD_EX32(bus->regs, aspeed_i2c_bus_ctrl_offset(bus),
571
- MASTER_EN);
572
-}
573
-
574
-static inline bool aspeed_i2c_bus_is_enabled(AspeedI2CBus *bus)
575
-{
576
- uint32_t ctrl_reg = aspeed_i2c_bus_ctrl_offset(bus);
577
- return SHARED_ARRAY_FIELD_EX32(bus->regs, ctrl_reg, MASTER_EN) ||
578
- SHARED_ARRAY_FIELD_EX32(bus->regs, ctrl_reg, SLAVE_EN);
579
-}
580
-
581
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
582
{
583
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
584
--
171
--
585
2.35.3
172
2.47.1
586
173
587
174
diff view generated by jsdifflib
1
Based on :
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
https://lore.kernel.org/qemu-devel/20220324100439.478317-2-troy_lee@aspeedtech.com/
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
Cc: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
6
Cc: Jamin Lin <jamin_lin@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@redhat.com>
7
Cc: Steven Lee <steven_lee@aspeedtech.com>
8
Link: https://lore.kernel.org/r/20241204084453.610660-5-jamin_lin@aspeedtech.com
8
Reviewed-by: Joel Stanley <joel@jms.id.au>
9
Signed-off-by: Cédric Le Goater <clg@redhat.com>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
10
---
11
include/hw/i2c/aspeed_i2c.h | 1 +
11
include/hw/sd/aspeed_sdhci.h | 1 +
12
hw/i2c/aspeed_i2c.c | 24 ++++++++++++++++++++++++
12
hw/sd/aspeed_sdhci.c | 14 ++++++++++++++
13
2 files changed, 25 insertions(+)
13
2 files changed, 15 insertions(+)
14
14
15
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
15
diff --git a/include/hw/sd/aspeed_sdhci.h b/include/hw/sd/aspeed_sdhci.h
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/i2c/aspeed_i2c.h
17
--- a/include/hw/sd/aspeed_sdhci.h
18
+++ b/include/hw/i2c/aspeed_i2c.h
18
+++ b/include/hw/sd/aspeed_sdhci.h
19
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@
20
#define TYPE_ASPEED_2400_I2C TYPE_ASPEED_I2C "-ast2400"
20
#define TYPE_ASPEED_2400_SDHCI TYPE_ASPEED_SDHCI "-ast2400"
21
#define TYPE_ASPEED_2500_I2C TYPE_ASPEED_I2C "-ast2500"
21
#define TYPE_ASPEED_2500_SDHCI TYPE_ASPEED_SDHCI "-ast2500"
22
#define TYPE_ASPEED_2600_I2C TYPE_ASPEED_I2C "-ast2600"
22
#define TYPE_ASPEED_2600_SDHCI TYPE_ASPEED_SDHCI "-ast2600"
23
+#define TYPE_ASPEED_1030_I2C TYPE_ASPEED_I2C "-ast1030"
23
+#define TYPE_ASPEED_2700_SDHCI TYPE_ASPEED_SDHCI "-ast2700"
24
OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C)
24
OBJECT_DECLARE_TYPE(AspeedSDHCIState, AspeedSDHCIClass, ASPEED_SDHCI)
25
25
26
#define ASPEED_I2C_NR_BUSSES 16
26
#define ASPEED_SDHCI_NUM_SLOTS 2
27
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
27
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
28
index XXXXXXX..XXXXXXX 100644
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/i2c/aspeed_i2c.c
29
--- a/hw/sd/aspeed_sdhci.c
30
+++ b/hw/i2c/aspeed_i2c.c
30
+++ b/hw/sd/aspeed_sdhci.c
31
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_i2c_info = {
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdhci_class_init(ObjectClass *klass, void *data)
32
.class_init = aspeed_2600_i2c_class_init,
32
asc->capareg = 0x0000000701f80080;
33
};
33
}
34
34
35
+static void aspeed_1030_i2c_class_init(ObjectClass *klass, void *data)
35
+static void aspeed_2700_sdhci_class_init(ObjectClass *klass, void *data)
36
+{
36
+{
37
+ DeviceClass *dc = DEVICE_CLASS(klass);
37
+ DeviceClass *dc = DEVICE_CLASS(klass);
38
+ AspeedI2CClass *aic = ASPEED_I2C_CLASS(klass);
38
+ AspeedSDHCIClass *asc = ASPEED_SDHCI_CLASS(klass);
39
+
39
+
40
+ dc->desc = "ASPEED 1030 I2C Controller";
40
+ dc->desc = "ASPEED 2700 SDHCI Controller";
41
+
41
+ asc->capareg = 0x0000000719f80080;
42
+ aic->num_busses = 14;
43
+ aic->reg_size = 0x80;
44
+ aic->gap = -1; /* no gap */
45
+ aic->bus_get_irq = aspeed_2600_i2c_bus_get_irq;
46
+ aic->pool_size = 0x200;
47
+ aic->pool_base = 0xC00;
48
+ aic->bus_pool_base = aspeed_2600_i2c_bus_pool_base;
49
+ aic->has_dma = true;
50
+}
42
+}
51
+
43
+
52
+static const TypeInfo aspeed_1030_i2c_info = {
44
static const TypeInfo aspeed_sdhci_types[] = {
53
+ .name = TYPE_ASPEED_1030_I2C,
45
{
54
+ .parent = TYPE_ASPEED_I2C,
46
.name = TYPE_ASPEED_SDHCI,
55
+ .class_init = aspeed_1030_i2c_class_init,
47
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_sdhci_types[] = {
56
+};
48
.parent = TYPE_ASPEED_SDHCI,
57
+
49
.class_init = aspeed_2600_sdhci_class_init,
58
static void aspeed_i2c_register_types(void)
50
},
59
{
51
+ {
60
type_register_static(&aspeed_i2c_bus_info);
52
+ .name = TYPE_ASPEED_2700_SDHCI,
61
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_register_types(void)
53
+ .parent = TYPE_ASPEED_SDHCI,
62
type_register_static(&aspeed_2400_i2c_info);
54
+ .class_init = aspeed_2700_sdhci_class_init,
63
type_register_static(&aspeed_2500_i2c_info);
55
+ },
64
type_register_static(&aspeed_2600_i2c_info);
56
};
65
+ type_register_static(&aspeed_1030_i2c_info);
57
66
}
58
DEFINE_TYPES(aspeed_sdhci_types)
67
68
type_init(aspeed_i2c_register_types)
69
--
59
--
70
2.35.3
60
2.47.1
71
61
72
62
diff view generated by jsdifflib
New patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
2
3
Add SDHCI model for AST2700 SDHCI support. The SDHCI controller only support 1
4
slot and registers base address is start at 0x1408_0000 and its interrupt is
5
connected to GICINT133_INTC at bit 1.
6
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Link: https://lore.kernel.org/r/20241204084453.610660-6-jamin_lin@aspeedtech.com
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
---
12
hw/arm/aspeed_ast27x0.c | 20 ++++++++++++++++++++
13
1 file changed, 20 insertions(+)
14
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/arm/aspeed_ast27x0.c
18
+++ b/hw/arm/aspeed_ast27x0.c
19
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2700_memmap[] = {
20
[ASPEED_DEV_I2C] = 0x14C0F000,
21
[ASPEED_DEV_GPIO] = 0x14C0B000,
22
[ASPEED_DEV_RTC] = 0x12C0F000,
23
+ [ASPEED_DEV_SDHCI] = 0x14080000,
24
};
25
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
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
44
object_initialize_child(obj, "gpio", &s->gpio, typename);
45
46
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
47
+
48
+ snprintf(typename, sizeof(typename), "aspeed.sdhci-%s", socname);
49
+ object_initialize_child(obj, "sd-controller", &s->sdhci, typename);
50
+ object_property_set_int(OBJECT(&s->sdhci), "num-slots", 1, &error_abort);
51
+
52
+ /* Init sd card slot class here so that they're under the correct parent */
53
+ object_initialize_child(obj, "sd-controller.sdhci",
54
+ &s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
55
}
56
57
/*
58
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
59
sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0,
60
aspeed_soc_get_irq(s, ASPEED_DEV_RTC));
61
62
+ /* SDHCI */
63
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sdhci), errp)) {
64
+ return;
65
+ }
66
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sdhci), 0,
67
+ sc->memmap[ASPEED_DEV_SDHCI]);
68
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
69
+ aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
70
+
71
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
72
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
73
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
74
--
75
2.47.1
76
77
diff view generated by jsdifflib
1
From: Troy Lee <troy_lee@aspeedtech.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Instantiate the I2C buses in AST1030 model and create two slave device
3
Add SDHCI model for AST2700 eMMC support. The eMMC controller only support 1
4
for ast1030-evb.
4
slot and registers base address is start at 0x1209_0000 and its interrupt is
5
connected to GICINT 15.
5
6
6
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
Reviewed-by: Joel Stanley <joel@jms.id.au>
9
Link: https://lore.kernel.org/r/20241204084453.610660-7-jamin_lin@aspeedtech.com
10
[ clg : - adapted to current AST1030 upstream models
10
Signed-off-by: Cédric Le Goater <clg@redhat.com>
11
- changed AST2600 to AST1030 in comment
12
- fixed typo in commit log ]
13
Message-Id: <20220324100439.478317-3-troy_lee@aspeedtech.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
11
---
16
hw/arm/aspeed.c | 13 +++++++++++++
12
hw/arm/aspeed_ast27x0.c | 15 +++++++++++++++
17
hw/arm/aspeed_ast10x0.c | 18 ++++++++++++++++++
13
1 file changed, 15 insertions(+)
18
2 files changed, 31 insertions(+)
19
14
20
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
diff --git a/hw/arm/aspeed_ast27x0.c b/hw/arm/aspeed_ast27x0.c
21
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
22
--- a/hw/arm/aspeed.c
17
--- a/hw/arm/aspeed_ast27x0.c
23
+++ b/hw/arm/aspeed.c
18
+++ b/hw/arm/aspeed_ast27x0.c
24
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_init(Object *obj)
25
AST1030_INTERNAL_FLASH_SIZE);
20
/* Init sd card slot class here so that they're under the correct parent */
21
object_initialize_child(obj, "sd-controller.sdhci",
22
&s->sdhci.slots[0], TYPE_SYSBUS_SDHCI);
23
+
24
+ object_initialize_child(obj, "emmc-controller", &s->emmc, typename);
25
+ object_property_set_int(OBJECT(&s->emmc), "num-slots", 1, &error_abort);
26
+
27
+ object_initialize_child(obj, "emmc-controller.sdhci", &s->emmc.slots[0],
28
+ TYPE_SYSBUS_SDHCI);
26
}
29
}
27
30
28
+static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
31
/*
29
+{
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2700_realize(DeviceState *dev, Error **errp)
30
+ AspeedSoCState *soc = &bmc->soc;
33
sysbus_connect_irq(SYS_BUS_DEVICE(&s->sdhci), 0,
31
+
34
aspeed_soc_get_irq(s, ASPEED_DEV_SDHCI));
32
+ /* U10 24C08 connects to SDA/SCL Groupt 1 by default */
35
33
+ uint8_t *eeprom_buf = g_malloc0(32 * 1024);
36
+ /* eMMC */
34
+ smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 0), 0x50, eeprom_buf);
37
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->emmc), errp)) {
35
+
36
+ /* U11 LM75 connects to SDA/SCL Group 2 by default */
37
+ i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 1), "tmp105", 0x4d);
38
+}
39
+
40
static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
41
void *data)
42
{
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
44
amc->hw_strap1 = 0;
45
amc->hw_strap2 = 0;
46
mc->init = aspeed_minibmc_machine_init;
47
+ amc->i2c_init = ast1030_evb_i2c_init;
48
mc->default_ram_size = 0;
49
mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
50
amc->fmc_model = "sst25vf032b";
51
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
52
index XXXXXXX..XXXXXXX 100644
53
--- a/hw/arm/aspeed_ast10x0.c
54
+++ b/hw/arm/aspeed_ast10x0.c
55
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
56
object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu), "hw-strap1");
57
object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu), "hw-strap2");
58
59
+ snprintf(typename, sizeof(typename), "aspeed.i2c-%s", socname);
60
+ object_initialize_child(obj, "i2c", &s->i2c, typename);
61
+
62
snprintf(typename, sizeof(typename), "aspeed.timer-%s", socname);
63
object_initialize_child(obj, "timerctrl", &s->timerctrl, typename);
64
65
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
66
}
67
sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_DEV_SCU]);
68
69
+ /* I2C */
70
+
71
+ object_property_set_link(OBJECT(&s->i2c), "dram", OBJECT(&s->sram),
72
+ &error_abort);
73
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->i2c), errp)) {
74
+ return;
38
+ return;
75
+ }
39
+ }
76
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_DEV_I2C]);
40
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->emmc), 0,
77
+ for (i = 0; i < ASPEED_I2C_GET_CLASS(&s->i2c)->num_busses; i++) {
41
+ sc->memmap[ASPEED_DEV_EMMC]);
78
+ qemu_irq irq = qdev_get_gpio_in(DEVICE(&s->armv7m),
42
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->emmc), 0,
79
+ sc->irqmap[ASPEED_DEV_I2C] + i);
43
+ aspeed_soc_get_irq(s, ASPEED_DEV_EMMC));
80
+ /* The AST1030 I2C controller has one IRQ per bus. */
81
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c.busses[i]), 0, irq);
82
+ }
83
+
44
+
84
/* LPC */
45
create_unimplemented_device("ast2700.dpmcu", 0x11000000, 0x40000);
85
if (!sysbus_realize(SYS_BUS_DEVICE(&s->lpc), errp)) {
46
create_unimplemented_device("ast2700.iomem0", 0x12000000, 0x01000000);
86
return;
47
create_unimplemented_device("ast2700.iomem1", 0x14000000, 0x01000000);
87
--
48
--
88
2.35.3
49
2.47.1
89
50
90
51
diff view generated by jsdifflib
New patch
1
This simply moves the ast1030 tests to a new test file. No changes.
1
2
3
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
Link: https://lore.kernel.org/r/20241206131132.520911-2-clg@redhat.com
5
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
7
tests/functional/meson.build | 1 +
8
tests/functional/test_arm_aspeed.py | 64 ----------------
9
tests/functional/test_arm_aspeed_ast1030.py | 81 +++++++++++++++++++++
10
3 files changed, 82 insertions(+), 64 deletions(-)
11
create mode 100644 tests/functional/test_arm_aspeed_ast1030.py
12
13
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
14
index XXXXXXX..XXXXXXX 100644
15
--- a/tests/functional/meson.build
16
+++ b/tests/functional/meson.build
17
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
18
19
tests_arm_system_thorough = [
20
'arm_aspeed',
21
+ 'arm_aspeed_ast1030',
22
'arm_bpim2u',
23
'arm_canona1100',
24
'arm_collie',
25
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
26
index XXXXXXX..XXXXXXX 100755
27
--- a/tests/functional/test_arm_aspeed.py
28
+++ b/tests/functional/test_arm_aspeed.py
29
@@ -XXX,XX +XXX,XX @@
30
from zipfile import ZipFile
31
from unittest import skipUnless
32
33
-class AST1030Machine(LinuxKernelTest):
34
-
35
- ASSET_ZEPHYR_1_04 = Asset(
36
- ('https://github.com/AspeedTech-BMC'
37
- '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
38
- '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
39
-
40
- def test_ast1030_zephyros_1_04(self):
41
- self.set_machine('ast1030-evb')
42
-
43
- zip_file = self.ASSET_ZEPHYR_1_04.fetch()
44
-
45
- kernel_name = "ast1030-evb-demo/zephyr.elf"
46
- with ZipFile(zip_file, 'r') as zf:
47
- zf.extract(kernel_name, path=self.workdir)
48
- kernel_file = os.path.join(self.workdir, kernel_name)
49
-
50
- self.vm.set_console()
51
- self.vm.add_args('-kernel', kernel_file, '-nographic')
52
- self.vm.launch()
53
- self.wait_for_console_pattern("Booting Zephyr OS")
54
- exec_command_and_wait_for_pattern(self, "help",
55
- "Available commands")
56
-
57
- ASSET_ZEPHYR_1_07 = Asset(
58
- ('https://github.com/AspeedTech-BMC'
59
- '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
60
- 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
61
-
62
- def test_ast1030_zephyros_1_07(self):
63
- self.set_machine('ast1030-evb')
64
-
65
- zip_file = self.ASSET_ZEPHYR_1_07.fetch()
66
-
67
- kernel_name = "ast1030-evb-demo/zephyr.bin"
68
- with ZipFile(zip_file, 'r') as zf:
69
- zf.extract(kernel_name, path=self.workdir)
70
- kernel_file = os.path.join(self.workdir, kernel_name)
71
-
72
- self.vm.set_console()
73
- self.vm.add_args('-kernel', kernel_file, '-nographic')
74
- self.vm.launch()
75
- self.wait_for_console_pattern("Booting Zephyr OS")
76
- for shell_cmd in [
77
- 'kernel stacks',
78
- 'otp info conf',
79
- 'otp info scu',
80
- 'hwinfo devid',
81
- 'crypto aes256_cbc_vault',
82
- 'random get',
83
- 'jtag JTAG1 sw_xfer high TMS',
84
- 'adc ADC0 resolution 12',
85
- 'adc ADC0 read 42',
86
- 'adc ADC1 read 69',
87
- 'i2c scan I2C_0',
88
- 'i3c attach I3C_0',
89
- 'hash test',
90
- 'kernel uptime',
91
- 'kernel reboot warm',
92
- 'kernel uptime',
93
- 'kernel reboot cold',
94
- 'kernel uptime',
95
- ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
96
-
97
class AST2x00Machine(LinuxKernelTest):
98
99
def do_test_arm_aspeed(self, machine, image):
100
diff --git a/tests/functional/test_arm_aspeed_ast1030.py b/tests/functional/test_arm_aspeed_ast1030.py
101
new file mode 100644
102
index XXXXXXX..XXXXXXX
103
--- /dev/null
104
+++ b/tests/functional/test_arm_aspeed_ast1030.py
105
@@ -XXX,XX +XXX,XX @@
106
+#!/usr/bin/env python3
107
+#
108
+# Functional test that boots the ASPEED SoCs with firmware
109
+#
110
+# Copyright (C) 2022 ASPEED Technology Inc
111
+#
112
+# SPDX-License-Identifier: GPL-2.0-or-later
113
+
114
+import os
115
+
116
+from qemu_test import LinuxKernelTest, Asset
117
+from qemu_test import exec_command_and_wait_for_pattern
118
+from zipfile import ZipFile
119
+
120
+class AST1030Machine(LinuxKernelTest):
121
+
122
+ ASSET_ZEPHYR_1_04 = Asset(
123
+ ('https://github.com/AspeedTech-BMC'
124
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip'),
125
+ '4ac6210adcbc61294927918707c6762483fd844dde5e07f3ba834ad1f91434d3')
126
+
127
+ def test_ast1030_zephyros_1_04(self):
128
+ self.set_machine('ast1030-evb')
129
+
130
+ zip_file = self.ASSET_ZEPHYR_1_04.fetch()
131
+
132
+ kernel_name = "ast1030-evb-demo/zephyr.elf"
133
+ with ZipFile(zip_file, 'r') as zf:
134
+ zf.extract(kernel_name, path=self.workdir)
135
+ kernel_file = os.path.join(self.workdir, kernel_name)
136
+
137
+ self.vm.set_console()
138
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
139
+ self.vm.launch()
140
+ self.wait_for_console_pattern("Booting Zephyr OS")
141
+ exec_command_and_wait_for_pattern(self, "help",
142
+ "Available commands")
143
+
144
+ ASSET_ZEPHYR_1_07 = Asset(
145
+ ('https://github.com/AspeedTech-BMC'
146
+ '/zephyr/releases/download/v00.01.07/ast1030-evb-demo.zip'),
147
+ 'ad52e27959746988afaed8429bf4e12ab988c05c4d07c9d90e13ec6f7be4574c')
148
+
149
+ def test_ast1030_zephyros_1_07(self):
150
+ self.set_machine('ast1030-evb')
151
+
152
+ zip_file = self.ASSET_ZEPHYR_1_07.fetch()
153
+
154
+ kernel_name = "ast1030-evb-demo/zephyr.bin"
155
+ with ZipFile(zip_file, 'r') as zf:
156
+ zf.extract(kernel_name, path=self.workdir)
157
+ kernel_file = os.path.join(self.workdir, kernel_name)
158
+
159
+ self.vm.set_console()
160
+ self.vm.add_args('-kernel', kernel_file, '-nographic')
161
+ self.vm.launch()
162
+ self.wait_for_console_pattern("Booting Zephyr OS")
163
+ for shell_cmd in [
164
+ 'kernel stacks',
165
+ 'otp info conf',
166
+ 'otp info scu',
167
+ 'hwinfo devid',
168
+ 'crypto aes256_cbc_vault',
169
+ 'random get',
170
+ 'jtag JTAG1 sw_xfer high TMS',
171
+ 'adc ADC0 resolution 12',
172
+ 'adc ADC0 read 42',
173
+ 'adc ADC1 read 69',
174
+ 'i2c scan I2C_0',
175
+ 'i3c attach I3C_0',
176
+ 'hash test',
177
+ 'kernel uptime',
178
+ 'kernel reboot warm',
179
+ 'kernel uptime',
180
+ 'kernel reboot cold',
181
+ 'kernel uptime',
182
+ ]: exec_command_and_wait_for_pattern(self, shell_cmd, "uart:~$")
183
+
184
+
185
+if __name__ == '__main__':
186
+ LinuxKernelTest.main()
187
--
188
2.47.1
189
190
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
This introduces a new aspeed module for sharing code between tests and
2
moves the palmetto test to a new test file. No changes in the test.
2
3
3
Signed-off-by: Joel Stanley <joel@jms.id.au>
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
5
Link: https://lore.kernel.org/r/20241206131132.520911-3-clg@redhat.com
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
7
---
7
hw/misc/aspeed_hace.c | 4 ++--
8
tests/functional/aspeed.py | 23 +++++++++++++++++++
8
1 file changed, 2 insertions(+), 2 deletions(-)
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
9
15
10
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
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
11
index XXXXXXX..XXXXXXX 100644
46
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/misc/aspeed_hace.c
47
--- a/tests/functional/meson.build
13
+++ b/hw/misc/aspeed_hace.c
48
+++ b/tests/functional/meson.build
14
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_write(void *opaque, hwaddr addr, uint64_t data,
49
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
15
50
'aarch64_tuxrun' : 240,
16
if ((data & HASH_HMAC_MASK)) {
51
'aarch64_virt' : 720,
17
qemu_log_mask(LOG_UNIMP,
52
'acpi_bits' : 420,
18
- "%s: HMAC engine command mode %"PRIx64" not implemented",
53
+ 'arm_aspeed_palmetto' : 120,
19
+ "%s: HMAC engine command mode %"PRIx64" not implemented\n",
54
'arm_aspeed' : 600,
20
__func__, (data & HASH_HMAC_MASK) >> 8);
55
'arm_bpim2u' : 500,
21
}
56
'arm_collie' : 180,
22
if (data & BIT(1)) {
57
@@ -XXX,XX +XXX,XX @@ tests_alpha_system_thorough = [
23
qemu_log_mask(LOG_UNIMP,
58
tests_arm_system_thorough = [
24
- "%s: Cascaded mode not implemented",
59
'arm_aspeed',
25
+ "%s: Cascaded mode not implemented\n",
60
'arm_aspeed_ast1030',
26
__func__);
61
+ 'arm_aspeed_palmetto',
27
}
62
'arm_bpim2u',
28
algo = hash_algo_lookup(data);
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()
29
--
116
--
30
2.35.3
117
2.47.1
31
118
32
119
diff view generated by jsdifflib
1
It's easier to run. Keep test_arm_ast2600_debian() under the
1
This simply moves the romulus-bmc test to a new test file. No changes
2
boot_linux_console.py file because it requires the extract_from_deb()
2
in the test. The do_test_arm_aspeed routine is removed from the
3
helper. We could remove it when we have tests for the AST2600.
3
test_arm_aspeed.py file because it is now unused.
4
4
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
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>
6
---
8
---
7
tests/avocado/boot_linux_console.py | 43 -------------------------
9
tests/functional/meson.build | 2 ++
8
tests/avocado/machine_aspeed.py | 50 +++++++++++++++++++++++++++++
10
tests/functional/test_arm_aspeed.py | 26 ---------------------
9
2 files changed, 50 insertions(+), 43 deletions(-)
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
10
14
11
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
12
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
13
--- a/tests/avocado/boot_linux_console.py
17
--- a/tests/functional/meson.build
14
+++ b/tests/avocado/boot_linux_console.py
18
+++ b/tests/functional/meson.build
15
@@ -XXX,XX +XXX,XX @@ def test_arm_vexpressa9(self):
19
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
16
self.vm.add_args('-dtb', self.workdir + '/day16/vexpress-v2p-ca9.dtb')
20
'aarch64_virt' : 720,
17
self.do_test_advcal_2018('16', tar_hash, 'winter.zImage')
21
'acpi_bits' : 420,
18
22
'arm_aspeed_palmetto' : 120,
19
- def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
23
+ 'arm_aspeed_romulus' : 120,
20
- """
24
'arm_aspeed' : 600,
21
- :avocado: tags=arch:arm
25
'arm_bpim2u' : 500,
22
- :avocado: tags=machine:palmetto-bmc
26
'arm_collie' : 180,
23
- """
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
24
-
28
'arm_aspeed',
25
- image_url = ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
29
'arm_aspeed_ast1030',
26
- 'obmc-phosphor-image-palmetto.static.mtd')
30
'arm_aspeed_palmetto',
27
- image_hash = ('3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d')
31
+ 'arm_aspeed_romulus',
28
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
32
'arm_bpim2u',
29
- algorithm='sha256')
33
'arm_canona1100',
30
-
34
'arm_collie',
31
- self.do_test_arm_aspeed(image_path)
35
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
32
-
36
index XXXXXXX..XXXXXXX 100755
33
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
37
--- a/tests/functional/test_arm_aspeed.py
34
- """
38
+++ b/tests/functional/test_arm_aspeed.py
35
- :avocado: tags=arch:arm
39
@@ -XXX,XX +XXX,XX @@
36
- :avocado: tags=machine:romulus-bmc
40
37
- """
41
class AST2x00Machine(LinuxKernelTest):
38
-
42
39
- image_url = ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
43
- def do_test_arm_aspeed(self, machine, image):
40
- 'obmc-phosphor-image-romulus.static.mtd')
44
- self.set_machine(machine)
41
- image_hash = ('820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
42
- image_path = self.fetch_asset(image_url, asset_hash=image_hash,
43
- algorithm='sha256')
44
-
45
- self.do_test_arm_aspeed(image_path)
46
-
47
- def do_test_arm_aspeed(self, image):
48
- self.vm.set_console()
45
- self.vm.set_console()
49
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
46
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
50
- '-net', 'nic')
47
- '-net', 'nic', '-snapshot')
51
- self.vm.launch()
48
- self.vm.launch()
52
-
49
-
53
- self.wait_for_console_pattern("U-Boot 2016.07")
50
- self.wait_for_console_pattern("U-Boot 2016.07")
54
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
51
- self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
55
- self.wait_for_console_pattern("Starting kernel ...")
52
- self.wait_for_console_pattern("Starting kernel ...")
56
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
53
- self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
57
- self.wait_for_console_pattern(
54
- self.wait_for_console_pattern(
58
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
55
- "aspeed-smc 1e620000.spi: read control register: 203b0641")
59
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
56
- self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
60
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
57
- self.wait_for_console_pattern("systemd[1]: Set hostname to")
61
-
58
-
62
def test_arm_ast2600_debian(self):
59
- ASSET_ROMULUS_FLASH = Asset(
63
"""
60
- ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
64
:avocado: tags=arch:arm
61
- 'obmc-phosphor-image-romulus.static.mtd'),
65
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
62
- '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
66
index XXXXXXX..XXXXXXX 100644
63
-
67
--- a/tests/avocado/machine_aspeed.py
64
- def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
68
+++ b/tests/avocado/machine_aspeed.py
65
- image_path = self.ASSET_ROMULUS_FLASH.fetch()
69
@@ -XXX,XX +XXX,XX @@ def test_ast1030_zephyros(self):
66
-
70
wait_for_console_pattern(self, "Booting Zephyr OS")
67
- self.do_test_arm_aspeed('romulus-bmc', image_path)
71
exec_command_and_wait_for_pattern(self, "help",
68
-
72
"Available commands")
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
73
+
83
+
74
+class AST2x00Machine(QemuSystemTest):
84
+from qemu_test import Asset
85
+from aspeed import AspeedTest
75
+
86
+
76
+ def wait_for_console_pattern(self, success_message, vm=None):
87
+class RomulusMachine(AspeedTest):
77
+ wait_for_console_pattern(self, success_message,
78
+ failure_message='Kernel panic - not syncing',
79
+ vm=vm)
80
+
88
+
81
+ def do_test_arm_aspeed(self, image):
89
+ ASSET_ROMULUS_FLASH = Asset(
82
+ self.vm.set_console()
90
+ ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
83
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
91
+ 'obmc-phosphor-image-romulus.static.mtd'),
84
+ '-net', 'nic')
92
+ '820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
85
+ self.vm.launch()
86
+
87
+ self.wait_for_console_pattern("U-Boot 2016.07")
88
+ self.wait_for_console_pattern("## Loading kernel from FIT Image at 20080000")
89
+ self.wait_for_console_pattern("Starting kernel ...")
90
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0x0")
91
+ wait_for_console_pattern(self,
92
+ "aspeed-smc 1e620000.spi: read control register: 203b0641")
93
+ self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
94
+ self.wait_for_console_pattern("systemd[1]: Set hostname to")
95
+
96
+ def test_arm_ast2400_palmetto_openbmc_v2_9_0(self):
97
+ """
98
+ :avocado: tags=arch:arm
99
+ :avocado: tags=machine:palmetto-bmc
100
+ """
101
+
102
+ image_url = ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
103
+ 'obmc-phosphor-image-palmetto.static.mtd')
104
+ image_hash = ('3e13bbbc28e424865dc42f35ad672b10f2e82cdb11846bb28fa625b48beafd0d')
105
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
106
+ algorithm='sha256')
107
+
108
+ self.do_test_arm_aspeed(image_path)
109
+
93
+
110
+ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
94
+ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
111
+ """
95
+ image_path = self.ASSET_ROMULUS_FLASH.fetch()
112
+ :avocado: tags=arch:arm
113
+ :avocado: tags=machine:romulus-bmc
114
+ """
115
+
96
+
116
+ image_url = ('https://github.com/openbmc/openbmc/releases/download/2.9.0/'
97
+ self.do_test_arm_aspeed('romulus-bmc', image_path)
117
+ 'obmc-phosphor-image-romulus.static.mtd')
118
+ image_hash = ('820341076803f1955bc31e647a512c79f9add4f5233d0697678bab4604c7bb25')
119
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
120
+ algorithm='sha256')
121
+
98
+
122
+ self.do_test_arm_aspeed(image_path)
99
+
100
+if __name__ == '__main__':
101
+ AspeedTest.main()
123
--
102
--
124
2.35.3
103
2.47.1
125
104
126
105
diff view generated by jsdifflib
1
Buildroot images are smaller than the OpenBMC images and faster to
1
This moves the ast2500-evb tests to a new test file and extends the
2
run. Built from source using :
2
aspeed module with routines used to run the buildroot and sdk
3
3
tests. No changes in the test.
4
http://patchwork.ozlabs.org/project/buildroot/list/?series=303465
4
5
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
Link: https://lore.kernel.org/r/20241206131132.520911-5-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
8
---
8
tests/avocado/machine_aspeed.py | 52 +++++++++++++++++++++++++++++++++
9
tests/functional/aspeed.py | 33 ++++++++++++
9
1 file changed, 52 insertions(+)
10
tests/functional/meson.build | 2 +
10
11
tests/functional/test_arm_aspeed.py | 44 ---------------
11
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
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
12
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
13
--- a/tests/avocado/machine_aspeed.py
18
--- a/tests/functional/aspeed.py
14
+++ b/tests/avocado/machine_aspeed.py
19
+++ b/tests/functional/aspeed.py
15
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
16
# This work is licensed under the terms of the GNU GPL, version 2 or
21
#
17
# later. See the COPYING file in the top-level directory.
22
# SPDX-License-Identifier: GPL-2.0-or-later
18
23
19
+import time
24
+from qemu_test import exec_command_and_wait_for_pattern
20
+
25
from qemu_test import LinuxKernelTest
21
from avocado_qemu import QemuSystemTest
26
22
from avocado_qemu import wait_for_console_pattern
27
class AspeedTest(LinuxKernelTest):
23
+from avocado_qemu import exec_command
28
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed(self, machine, image):
24
from avocado_qemu import exec_command_and_wait_for_pattern
29
"aspeed-smc 1e620000.spi: read control register: 203b0641")
25
from avocado.utils import archive
30
self.wait_for_console_pattern("ftgmac100 1e660000.ethernet eth0: irq ")
26
31
self.wait_for_console_pattern("systemd[1]: Set hostname to")
27
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2500_romulus_openbmc_v2_9_0(self):
32
+
28
algorithm='sha256')
33
+ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
29
34
+ self.require_netdev('user')
30
self.do_test_arm_aspeed(image_path)
31
+
32
+ def do_test_arm_aspeed_buidroot_start(self, image, cpu_id):
33
+ self.vm.set_console()
35
+ self.vm.set_console()
34
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
36
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
35
+ '-net', 'nic', '-net', 'user')
37
+ '-net', 'nic', '-net', 'user')
36
+ self.vm.launch()
38
+ self.vm.launch()
37
+
39
+
38
+ self.wait_for_console_pattern('U-Boot 2019.04')
40
+ self.wait_for_console_pattern('U-Boot 2019.04')
39
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
41
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
40
+ self.wait_for_console_pattern('Starting kernel ...')
42
+ self.wait_for_console_pattern('Starting kernel ...')
41
+ self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
43
+ self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
42
+ self.wait_for_console_pattern('lease of 10.0.2.15')
44
+ self.wait_for_console_pattern('lease of 10.0.2.15')
43
+ self.wait_for_console_pattern('Aspeed EVB')
45
+ # the line before login:
44
+ exec_command(self, 'root')
46
+ self.wait_for_console_pattern(pattern)
45
+ time.sleep(0.1)
47
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
46
+
48
+ exec_command_and_wait_for_pattern(self, 'passw0rd', '#')
47
+ def do_test_arm_aspeed_buidroot_poweroff(self):
49
+
50
+ def do_test_arm_aspeed_buildroot_poweroff(self):
48
+ exec_command_and_wait_for_pattern(self, 'poweroff',
51
+ exec_command_and_wait_for_pattern(self, 'poweroff',
49
+ 'reboot: System halted');
52
+ 'reboot: System halted');
50
+
53
+
51
+ def test_arm_ast2500_evb_builroot(self):
54
+ def do_test_arm_aspeed_sdk_start(self, image):
52
+ """
55
+ self.require_netdev('user')
53
+ :avocado: tags=arch:arm
56
+ self.vm.set_console()
54
+ :avocado: tags=machine:ast2500-evb
57
+ self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
55
+ """
58
+ '-net', 'nic', '-net', 'user', '-snapshot')
56
+
59
+ self.vm.launch()
57
+ image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
60
+
58
+ 'images/ast2500-evb/buildroot-2022.05/flash.img')
61
+ self.wait_for_console_pattern('U-Boot 2019.04')
59
+ image_hash = ('549db6e9d8cdaf4367af21c36385a68bb465779c18b5e37094fc7343decccd3f')
62
+ self.wait_for_console_pattern('## Loading kernel from FIT Image')
60
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
63
+ self.wait_for_console_pattern('Starting kernel ...')
61
+ algorithm='sha256')
64
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
62
+
65
index XXXXXXX..XXXXXXX 100644
63
+ self.do_test_arm_aspeed_buidroot_start(image_path, '0x0')
66
--- a/tests/functional/meson.build
64
+ self.do_test_arm_aspeed_buidroot_poweroff()
67
+++ b/tests/functional/meson.build
65
+
68
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
66
+ def test_arm_ast2600_evb_builroot(self):
69
'acpi_bits' : 420,
67
+ """
70
'arm_aspeed_palmetto' : 120,
68
+ :avocado: tags=arch:arm
71
'arm_aspeed_romulus' : 120,
69
+ :avocado: tags=machine:ast2600-evb
72
+ 'arm_aspeed_ast2500' : 480,
70
+ """
73
'arm_aspeed' : 600,
71
+
74
'arm_bpim2u' : 500,
72
+ image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
75
'arm_collie' : 180,
73
+ 'images/ast2600-evb/buildroot-2022.05/flash.img')
76
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
74
+ image_hash = ('6cc9e7d128fd4fa1fd01c883af67593cae8072c3239a0b8b6ace857f3538a92d')
77
'arm_aspeed_ast1030',
75
+ image_path = self.fetch_asset(image_url, asset_hash=image_hash,
78
'arm_aspeed_palmetto',
76
+ algorithm='sha256')
79
'arm_aspeed_romulus',
77
+
80
+ 'arm_aspeed_ast2500',
78
+ self.do_test_arm_aspeed_buidroot_start(image_path, '0xf00')
81
'arm_bpim2u',
79
+ self.do_test_arm_aspeed_buidroot_poweroff()
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()
80
--
211
--
81
2.35.3
212
2.47.1
82
213
83
214
diff view generated by jsdifflib
1
Create a named I2C temperature sensor device on the command line,
1
This moves the ast2600-evb tests to a new test file. No changes in the
2
instantiate device from Linux since it is not part of the device tree,
2
test. The routines used to run the buildroot and sdk tests are removed
3
and check the temperature is correctly reported under sysfs.
3
from the test_arm_aspeed.py file because now unused.
4
4
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Reviewed-by: Thomas Huth <thuth@redhat.com>
6
Link: https://lore.kernel.org/r/20241206131132.520911-6-clg@redhat.com
7
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
8
---
7
tests/avocado/machine_aspeed.py | 13 +++++++++++++
9
tests/functional/meson.build | 2 +
8
1 file changed, 13 insertions(+)
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
9
14
10
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
15
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
11
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
12
--- a/tests/avocado/machine_aspeed.py
17
--- a/tests/functional/meson.build
13
+++ b/tests/avocado/machine_aspeed.py
18
+++ b/tests/functional/meson.build
14
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2500_evb_builroot(self):
19
@@ -XXX,XX +XXX,XX @@ test_timeouts = {
15
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
20
'arm_aspeed_palmetto' : 120,
16
algorithm='sha256')
21
'arm_aspeed_romulus' : 120,
17
22
'arm_aspeed_ast2500' : 480,
23
+ 'arm_aspeed_ast2600' : 720,
24
'arm_aspeed' : 600,
25
'arm_bpim2u' : 500,
26
'arm_collie' : 180,
27
@@ -XXX,XX +XXX,XX @@ tests_arm_system_thorough = [
28
'arm_aspeed_palmetto',
29
'arm_aspeed_romulus',
30
'arm_aspeed_ast2500',
31
+ 'arm_aspeed_ast2600',
32
'arm_bpim2u',
33
'arm_canona1100',
34
'arm_collie',
35
diff --git a/tests/functional/test_arm_aspeed.py b/tests/functional/test_arm_aspeed.py
36
index XXXXXXX..XXXXXXX 100755
37
--- a/tests/functional/test_arm_aspeed.py
38
+++ b/tests/functional/test_arm_aspeed.py
39
@@ -XXX,XX +XXX,XX @@
40
from zipfile import ZipFile
41
from unittest import skipUnless
42
43
-class AST2x00Machine(LinuxKernelTest):
44
-
45
- def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'):
46
- self.require_netdev('user')
47
- self.vm.set_console()
48
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw,read-only=true',
49
- '-net', 'nic', '-net', 'user')
50
- self.vm.launch()
51
-
52
- self.wait_for_console_pattern('U-Boot 2019.04')
53
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
54
- self.wait_for_console_pattern('Starting kernel ...')
55
- self.wait_for_console_pattern('Booting Linux on physical CPU ' + cpu_id)
56
- self.wait_for_console_pattern('lease of 10.0.2.15')
57
- # the line before login:
58
- self.wait_for_console_pattern(pattern)
59
- exec_command_and_wait_for_pattern(self, 'root', 'Password:')
60
- exec_command_and_wait_for_pattern(self, 'passw0rd', '#')
61
-
62
- def do_test_arm_aspeed_buildroot_poweroff(self):
63
- exec_command_and_wait_for_pattern(self, 'poweroff',
64
- 'reboot: System halted');
65
- ASSET_BR2_202311_AST2600_FLASH = Asset(
66
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
67
- 'images/ast2600-evb/buildroot-2023.11/flash.img'),
68
- 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
69
-
70
- def test_arm_ast2600_evb_buildroot(self):
71
- self.set_machine('ast2600-evb')
72
-
73
- image_path = self.ASSET_BR2_202311_AST2600_FLASH.fetch()
74
-
75
- self.vm.add_args('-device',
76
- 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
77
- self.vm.add_args('-device',
78
- 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
79
- self.vm.add_args('-device',
80
- 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
81
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00',
82
- 'ast2600-evb login:')
83
-
84
- exec_command_and_wait_for_pattern(self,
85
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
86
- 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
87
- exec_command_and_wait_for_pattern(self,
88
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
89
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
90
- property='temperature', value=18000);
91
- exec_command_and_wait_for_pattern(self,
92
- 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
93
-
94
- exec_command_and_wait_for_pattern(self,
95
- 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
96
- 'i2c i2c-3: new_device: Instantiated device ds1307 at 0x32');
97
- year = time.strftime("%Y")
98
- exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
99
-
100
- exec_command_and_wait_for_pattern(self,
101
- 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
102
- 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
103
- exec_command_and_wait_for_pattern(self,
104
- 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
105
- exec_command_and_wait_for_pattern(self,
106
- 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
107
- '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
108
- self.do_test_arm_aspeed_buildroot_poweroff()
109
-
110
- ASSET_BR2_202302_AST2600_TPM_FLASH = Asset(
111
- ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
112
- 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'),
113
- 'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
114
-
115
- @skipUnless(*has_cmd('swtpm'))
116
- def test_arm_ast2600_evb_buildroot_tpm(self):
117
- self.set_machine('ast2600-evb')
118
-
119
- image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
120
-
121
- tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
122
- socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
123
-
124
- # We must put the TPM state dir in /tmp/, not the build dir,
125
- # because some distros use AppArmor to lock down swtpm and
126
- # restrict the set of locations it can access files in.
127
- subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
128
- '--tpmstate', f'dir={tpmstate_dir.name}',
129
- '--ctrl', f'type=unixio,path={socket}'])
130
-
131
- self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
132
- self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
133
- self.vm.add_args('-device',
134
- 'tpm-tis-i2c,tpmdev=tpm0,bus=aspeed.i2c.bus.12,address=0x2e')
135
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
136
-
137
- exec_command_and_wait_for_pattern(self,
138
- 'echo tpm_tis_i2c 0x2e > /sys/bus/i2c/devices/i2c-12/new_device',
139
- 'tpm_tis_i2c 12-002e: 2.0 TPM (device-id 0x1, rev-id 1)');
140
- exec_command_and_wait_for_pattern(self,
141
- 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
142
- 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
143
-
144
- self.do_test_arm_aspeed_buildroot_poweroff()
145
-
146
- def do_test_arm_aspeed_sdk_start(self, image):
147
- self.require_netdev('user')
148
- self.vm.set_console()
149
- self.vm.add_args('-drive', 'file=' + image + ',if=mtd,format=raw',
150
- '-net', 'nic', '-net', 'user', '-snapshot')
151
- self.vm.launch()
152
-
153
- self.wait_for_console_pattern('U-Boot 2019.04')
154
- self.wait_for_console_pattern('## Loading kernel from FIT Image')
155
- self.wait_for_console_pattern('Starting kernel ...')
156
-
157
- ASSET_SDK_V806_AST2600_A2 = Asset(
158
- 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
159
- '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
160
-
161
- def test_arm_ast2600_evb_sdk(self):
162
- self.set_machine('ast2600-evb')
163
-
164
- image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
165
-
166
- archive_extract(image_path, self.workdir)
167
-
168
- self.vm.add_args('-device',
169
- 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
170
- self.vm.add_args('-device',
171
- 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
172
- self.do_test_arm_aspeed_sdk_start(
173
- self.workdir + '/ast2600-a2/image-bmc')
174
-
175
- self.wait_for_console_pattern('ast2600-a2 login:')
176
-
177
- exec_command_and_wait_for_pattern(self, 'root', 'Password:')
178
- exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
179
-
180
- exec_command_and_wait_for_pattern(self,
181
- 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
182
- 'i2c i2c-5: new_device: Instantiated device lm75 at 0x4d');
183
- exec_command_and_wait_for_pattern(self,
184
- 'cat /sys/class/hwmon/hwmon19/temp1_input', '0')
185
- self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
186
- property='temperature', value=18000);
187
- exec_command_and_wait_for_pattern(self,
188
- 'cat /sys/class/hwmon/hwmon19/temp1_input', '18000')
189
-
190
- exec_command_and_wait_for_pattern(self,
191
- 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-5/device/new_device',
192
- 'i2c i2c-5: new_device: Instantiated device ds1307 at 0x32');
193
- year = time.strftime("%Y")
194
- exec_command_and_wait_for_pattern(self,
195
- '/sbin/hwclock -f /dev/rtc1', year);
196
-
197
-
198
class AST2x00MachineMMC(LinuxKernelTest):
199
200
ASSET_RAINIER_EMMC = Asset(
201
diff --git a/tests/functional/test_arm_aspeed_ast2600.py b/tests/functional/test_arm_aspeed_ast2600.py
202
new file mode 100644
203
index XXXXXXX..XXXXXXX
204
--- /dev/null
205
+++ b/tests/functional/test_arm_aspeed_ast2600.py
206
@@ -XXX,XX +XXX,XX @@
207
+#!/usr/bin/env python3
208
+#
209
+# Functional test that boots the ASPEED machines
210
+#
211
+# SPDX-License-Identifier: GPL-2.0-or-later
212
+
213
+import os
214
+import time
215
+import tempfile
216
+import subprocess
217
+
218
+from qemu_test import Asset
219
+from aspeed import AspeedTest
220
+from qemu_test import exec_command_and_wait_for_pattern
221
+from qemu_test import has_cmd
222
+from qemu_test.utils import archive_extract
223
+from unittest import skipUnless
224
+
225
+class AST2600Machine(AspeedTest):
226
+
227
+ ASSET_BR2_202311_AST2600_FLASH = Asset(
228
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
229
+ 'images/ast2600-evb/buildroot-2023.11/flash.img'),
230
+ 'b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
231
+
232
+ def test_arm_ast2600_evb_buildroot(self):
233
+ self.set_machine('ast2600-evb')
234
+
235
+ image_path = self.ASSET_BR2_202311_AST2600_FLASH.fetch()
236
+
18
+ self.vm.add_args('-device',
237
+ self.vm.add_args('-device',
19
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
238
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
20
self.do_test_arm_aspeed_buidroot_start(image_path, '0x0')
239
+ self.vm.add_args('-device',
240
+ 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
241
+ self.vm.add_args('-device',
242
+ 'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
243
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00',
244
+ 'ast2600-evb login:')
21
+
245
+
22
+ exec_command_and_wait_for_pattern(self,
246
+ exec_command_and_wait_for_pattern(self,
23
+ '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',
24
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
248
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
25
+ exec_command_and_wait_for_pattern(self,
249
+ exec_command_and_wait_for_pattern(self,
26
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
250
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
27
+ self.vm.command('qom-set', path='/machine/peripheral/tmp-test',
251
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
28
+ property='temperature', value=18000);
252
+ property='temperature', value=18000);
29
+ exec_command_and_wait_for_pattern(self,
253
+ exec_command_and_wait_for_pattern(self,
30
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
254
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
31
+
255
+
32
self.do_test_arm_aspeed_buidroot_poweroff()
256
+ exec_command_and_wait_for_pattern(self,
33
257
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
34
def test_arm_ast2600_evb_builroot(self):
258
+ 'i2c i2c-3: new_device: Instantiated device ds1307 at 0x32');
259
+ year = time.strftime("%Y")
260
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
261
+
262
+ exec_command_and_wait_for_pattern(self,
263
+ 'echo slave-24c02 0x1064 > /sys/bus/i2c/devices/i2c-3/new_device',
264
+ 'i2c i2c-3: new_device: Instantiated device slave-24c02 at 0x64');
265
+ exec_command_and_wait_for_pattern(self,
266
+ 'i2cset -y 3 0x42 0x64 0x00 0xaa i', '#');
267
+ exec_command_and_wait_for_pattern(self,
268
+ 'hexdump /sys/bus/i2c/devices/3-1064/slave-eeprom',
269
+ '0000000 ffaa ffff ffff ffff ffff ffff ffff ffff');
270
+ self.do_test_arm_aspeed_buildroot_poweroff()
271
+
272
+ ASSET_BR2_202302_AST2600_TPM_FLASH = Asset(
273
+ ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
274
+ 'images/ast2600-evb/buildroot-2023.02-tpm/flash.img'),
275
+ 'a46009ae8a5403a0826d607215e731a8c68d27c14c41e55331706b8f9c7bd997')
276
+
277
+ @skipUnless(*has_cmd('swtpm'))
278
+ def test_arm_ast2600_evb_buildroot_tpm(self):
279
+ self.set_machine('ast2600-evb')
280
+
281
+ image_path = self.ASSET_BR2_202302_AST2600_TPM_FLASH.fetch()
282
+
283
+ tpmstate_dir = tempfile.TemporaryDirectory(prefix="qemu_")
284
+ socket = os.path.join(tpmstate_dir.name, 'swtpm-socket')
285
+
286
+ # We must put the TPM state dir in /tmp/, not the build dir,
287
+ # because some distros use AppArmor to lock down swtpm and
288
+ # restrict the set of locations it can access files in.
289
+ subprocess.run(['swtpm', 'socket', '-d', '--tpm2',
290
+ '--tpmstate', f'dir={tpmstate_dir.name}',
291
+ '--ctrl', f'type=unixio,path={socket}'])
292
+
293
+ self.vm.add_args('-chardev', f'socket,id=chrtpm,path={socket}')
294
+ self.vm.add_args('-tpmdev', 'emulator,id=tpm0,chardev=chrtpm')
295
+ self.vm.add_args('-device',
296
+ 'tpm-tis-i2c,tpmdev=tpm0,bus=aspeed.i2c.bus.12,address=0x2e')
297
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
298
+
299
+ exec_command_and_wait_for_pattern(self,
300
+ 'echo tpm_tis_i2c 0x2e > /sys/bus/i2c/devices/i2c-12/new_device',
301
+ 'tpm_tis_i2c 12-002e: 2.0 TPM (device-id 0x1, rev-id 1)');
302
+ exec_command_and_wait_for_pattern(self,
303
+ 'cat /sys/class/tpm/tpm0/pcr-sha256/0',
304
+ 'B804724EA13F52A9072BA87FE8FDCC497DFC9DF9AA15B9088694639C431688E0');
305
+
306
+ self.do_test_arm_aspeed_buildroot_poweroff()
307
+
308
+ ASSET_SDK_V806_AST2600_A2 = Asset(
309
+ 'https://github.com/AspeedTech-BMC/openbmc/releases/download/v08.06/ast2600-a2-obmc.tar.gz',
310
+ '9083506135f622d5e7351fcf7d4e1c7125cee5ba16141220c0ba88931f3681a4')
311
+
312
+ def test_arm_ast2600_evb_sdk(self):
313
+ self.set_machine('ast2600-evb')
314
+
315
+ image_path = self.ASSET_SDK_V806_AST2600_A2.fetch()
316
+
317
+ archive_extract(image_path, self.workdir)
318
+
319
+ self.vm.add_args('-device',
320
+ 'tmp105,bus=aspeed.i2c.bus.5,address=0x4d,id=tmp-test');
321
+ self.vm.add_args('-device',
322
+ 'ds1338,bus=aspeed.i2c.bus.5,address=0x32');
323
+ self.do_test_arm_aspeed_sdk_start(
324
+ self.workdir + '/ast2600-a2/image-bmc')
325
+
326
+ self.wait_for_console_pattern('ast2600-a2 login:')
327
+
328
+ exec_command_and_wait_for_pattern(self, 'root', 'Password:')
329
+ exec_command_and_wait_for_pattern(self, '0penBmc', 'root@ast2600-a2:~#')
330
+
331
+ exec_command_and_wait_for_pattern(self,
332
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-5/device/new_device',
333
+ 'i2c i2c-5: new_device: Instantiated device lm75 at 0x4d');
334
+ exec_command_and_wait_for_pattern(self,
335
+ 'cat /sys/class/hwmon/hwmon19/temp1_input', '0')
336
+ self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
337
+ property='temperature', value=18000);
338
+ exec_command_and_wait_for_pattern(self,
339
+ 'cat /sys/class/hwmon/hwmon19/temp1_input', '18000')
340
+
341
+ exec_command_and_wait_for_pattern(self,
342
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-5/device/new_device',
343
+ 'i2c i2c-5: new_device: Instantiated device ds1307 at 0x32');
344
+ year = time.strftime("%Y")
345
+ exec_command_and_wait_for_pattern(self,
346
+ '/sbin/hwclock -f /dev/rtc1', year);
347
+
348
+if __name__ == '__main__':
349
+ AspeedTest.main()
35
--
350
--
36
2.35.3
351
2.47.1
37
352
38
353
diff view generated by jsdifflib
1
There is no 'slave match interrupt' enable bit in the Interrupt
1
This simply moves the rainier-bmc test to a new test file. No changes
2
Control Register. Consider it is always enabled and extend the mask
2
in the test. The test_arm_aspeed.py is deleted.
3
value 'bus->regs[intr_ctrl_reg]' with the SLAVE_ADDR_RX_MATCH bit when
4
the interrupt is raised.
5
3
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
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
---
7
---
8
hw/i2c/aspeed_i2c.c | 13 ++++++++++---
8
tests/functional/meson.build | 4 ++--
9
1 file changed, 10 insertions(+), 3 deletions(-)
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
10
13
11
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
14
diff --git a/tests/functional/meson.build b/tests/functional/meson.build
12
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
13
--- a/hw/i2c/aspeed_i2c.c
16
--- a/tests/functional/meson.build
14
+++ b/hw/i2c/aspeed_i2c.c
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
15
@@ -XXX,XX +XXX,XX @@
50
@@ -XXX,XX +XXX,XX @@
16
#include "hw/registerfields.h"
51
#!/usr/bin/env python3
17
#include "trace.h"
52
#
18
53
-# Functional test that boots the ASPEED SoCs with firmware
19
+/* Enable SLAVE_ADDR_RX_MATCH always */
54
-#
20
+#define R_I2CD_INTR_STS_ALWAYS_ENABLE R_I2CD_INTR_STS_SLAVE_ADDR_RX_MATCH_MASK
55
-# Copyright (C) 2022 ASPEED Technology Inc
21
+
56
+# Functional test that boots the ASPEED machines
22
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
57
#
23
{
58
# SPDX-License-Identifier: GPL-2.0-or-later
24
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
59
25
uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
60
-import os
26
uint32_t intr_ctrl_reg = aspeed_i2c_bus_intr_ctrl_offset(bus);
61
-import time
27
+ uint32_t intr_ctrl_mask = bus->regs[intr_ctrl_reg] |
62
-import subprocess
28
+ R_I2CD_INTR_STS_ALWAYS_ENABLE;
63
-import tempfile
29
bool raise_irq;
64
-
30
65
-from qemu_test import LinuxKernelTest, Asset
31
if (trace_event_get_state_backends(TRACE_ASPEED_I2C_BUS_RAISE_INTERRUPT)) {
66
-from qemu_test import exec_command_and_wait_for_pattern
32
- g_autofree char *buf = g_strdup_printf("%s%s%s%s%s%s",
67
-from qemu_test import interrupt_interactive_console_until_pattern
33
+ g_autofree char *buf = g_strdup_printf("%s%s%s%s%s%s%s",
68
-from qemu_test import has_cmd
34
aspeed_i2c_bus_pkt_mode_en(bus) &&
69
-from qemu_test.utils import archive_extract
35
ARRAY_FIELD_EX32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE) ?
70
-from zipfile import ZipFile
36
"pktdone|" : "",
71
-from unittest import skipUnless
37
@@ -XXX,XX +XXX,XX @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
72
+from qemu_test import Asset
38
"ack|" : "",
73
+from aspeed import AspeedTest
39
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ?
74
40
"done|" : "",
75
-class AST2x00MachineMMC(LinuxKernelTest):
41
+ ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, SLAVE_ADDR_RX_MATCH) ?
76
+class RainierMachine(AspeedTest):
42
+ "slave-match|" : "",
77
43
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, NORMAL_STOP) ?
78
ASSET_RAINIER_EMMC = Asset(
44
"normal|" : "",
79
('https://fileserver.linaro.org/s/B6pJTwWEkzSDi36/download/'
45
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, ABNORMAL) ?
80
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
46
@@ -XXX,XX +XXX,XX @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
81
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
47
trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts], buf);
82
48
}
83
if __name__ == '__main__':
49
84
- LinuxKernelTest.main()
50
- raise_irq = bus->regs[reg_intr_sts] & bus->regs[intr_ctrl_reg];
85
+ AspeedTest.main()
51
+ raise_irq = bus->regs[reg_intr_sts] & intr_ctrl_mask ;
52
53
/* In packet mode we don't mask off INTR_STS */
54
if (!aspeed_i2c_bus_pkt_mode_en(bus)) {
55
- bus->regs[reg_intr_sts] &= bus->regs[intr_ctrl_reg];
56
+ bus->regs[reg_intr_sts] &= intr_ctrl_mask;
57
}
58
59
if (raise_irq) {
60
--
86
--
61
2.35.3
87
2.47.1
62
88
63
89
diff view generated by jsdifflib
1
From: Klaus Jensen <k.jensen@samsung.com>
1
This simply moves the debian boot test from the avocado testsuite to
2
the new functional testsuite. No changes in the test.
2
3
3
Build a single string instead of having several parameters on the trace
4
Reviewed-by: Thomas Huth <thuth@redhat.com>
4
event.
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(-)
5
11
6
Suggested-by: Cédric Le Goater <clg@kaod.org>
12
diff --git a/tests/avocado/boot_linux_console.py b/tests/avocado/boot_linux_console.py
7
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
8
[ clg: simplified trace buffer creation ]
9
Message-Id: <20220601210831.67259-2-its@irrelevant.dk>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
hw/i2c/aspeed_i2c.c | 34 ++++++++++++++++++++++------------
13
hw/i2c/trace-events | 2 +-
14
2 files changed, 23 insertions(+), 13 deletions(-)
15
16
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
17
index XXXXXXX..XXXXXXX 100644
13
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/i2c/aspeed_i2c.c
14
--- a/tests/avocado/boot_linux_console.py
19
+++ b/hw/i2c/aspeed_i2c.c
15
+++ b/tests/avocado/boot_linux_console.py
20
@@ -XXX,XX +XXX,XX @@
16
@@ -XXX,XX +XXX,XX @@ def test_arm_quanta_gsj_initrd(self):
21
#include "qemu/osdep.h"
17
self.wait_for_console_pattern('CPU1: thread -1, cpu 1, socket 0')
22
#include "hw/sysbus.h"
18
self.wait_for_console_pattern(
23
#include "migration/vmstate.h"
19
'Give root password for system maintenance')
24
+#include "qemu/cutils.h"
20
-
25
#include "qemu/log.h"
21
- def test_arm_ast2600_debian(self):
26
#include "qemu/module.h"
22
- """
27
#include "qemu/error-report.h"
23
- :avocado: tags=arch:arm
28
@@ -XXX,XX +XXX,XX @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
24
- :avocado: tags=machine:rainier-bmc
29
uint32_t intr_ctrl_reg = aspeed_i2c_bus_intr_ctrl_offset(bus);
25
- """
30
bool raise_irq;
26
- deb_url = ('http://snapshot.debian.org/archive/debian/'
31
27
- '20220606T211338Z/'
32
- trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts],
28
- 'pool/main/l/linux/'
33
- aspeed_i2c_bus_pkt_mode_en(bus) &&
29
- 'linux-image-5.17.0-2-armmp_5.17.6-1%2Bb1_armhf.deb')
34
- ARRAY_FIELD_EX32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE) ?
30
- deb_hash = '8acb2b4439faedc2f3ed4bdb2847ad4f6e0491f73debaeb7f660c8abe4dcdc0e'
35
- "pktdone|" : "",
31
- deb_path = self.fetch_asset(deb_url, asset_hash=deb_hash,
36
- SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_NAK) ? "nak|" : "",
32
- algorithm='sha256')
37
- SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_ACK) ? "ack|" : "",
33
- kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
38
- SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ? "done|"
34
- dtb_path = self.extract_from_deb(deb_path,
39
- : "",
35
- '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
40
- SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, NORMAL_STOP) ?
36
-
41
- "normal|" : "",
37
- self.vm.set_console()
42
- SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, ABNORMAL) ? "abnormal"
38
- self.vm.add_args('-kernel', kernel_path,
43
- : "");
39
- '-dtb', dtb_path,
44
+ if (trace_event_get_state_backends(TRACE_ASPEED_I2C_BUS_RAISE_INTERRUPT)) {
40
- '-net', 'nic')
45
+ g_autofree char *buf = g_strdup_printf("%s%s%s%s%s%s",
41
- self.vm.launch()
46
+ aspeed_i2c_bus_pkt_mode_en(bus) &&
42
- self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
47
+ ARRAY_FIELD_EX32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE) ?
43
- self.wait_for_console_pattern("SMP: Total of 2 processors activated")
48
+ "pktdone|" : "",
44
- self.wait_for_console_pattern("No filesystem could mount root")
49
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_NAK) ?
45
-
50
+ "nak|" : "",
46
diff --git a/tests/functional/test_arm_aspeed_rainier.py b/tests/functional/test_arm_aspeed_rainier.py
51
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_ACK) ?
47
index XXXXXXX..XXXXXXX 100644
52
+ "ack|" : "",
48
--- a/tests/functional/test_arm_aspeed_rainier.py
53
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ?
49
+++ b/tests/functional/test_arm_aspeed_rainier.py
54
+ "done|" : "",
50
@@ -XXX,XX +XXX,XX @@ def test_arm_aspeed_emmc_boot(self):
55
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, NORMAL_STOP) ?
51
self.wait_for_console_pattern('mmcblk0: p1 p2 p3 p4 p5 p6 p7')
56
+ "normal|" : "",
52
self.wait_for_console_pattern('IBM eBMC (OpenBMC for IBM Enterprise')
57
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, ABNORMAL) ?
53
58
+ "abnormal" : "");
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')
59
+
57
+
60
+ trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts], buf);
58
+ def test_arm_debian_kernel_boot(self):
61
+ }
59
+ self.set_machine('rainier-bmc')
62
+
60
+
63
raise_irq = bus->regs[reg_intr_sts] & bus->regs[intr_ctrl_reg];
61
+ deb_path = self.ASSET_DEBIAN_LINUX_ARMHF_DEB.fetch()
64
+
62
+
65
/* In packet mode we don't mask off INTR_STS */
63
+ kernel_path = self.extract_from_deb(deb_path, '/boot/vmlinuz-5.17.0-2-armmp')
66
if (!aspeed_i2c_bus_pkt_mode_en(bus)) {
64
+ dtb_path = self.extract_from_deb(deb_path,
67
bus->regs[reg_intr_sts] &= bus->regs[intr_ctrl_reg];
65
+ '/usr/lib/linux-image-5.17.0-2-armmp/aspeed-bmc-ibm-rainier.dtb')
68
}
69
+
66
+
70
if (raise_irq) {
67
+ self.vm.set_console()
71
bus->controller->intr_status |= 1 << bus->id;
68
+ self.vm.add_args('-kernel', kernel_path,
72
qemu_irq_raise(aic->bus_get_irq(bus));
69
+ '-dtb', dtb_path,
73
diff --git a/hw/i2c/trace-events b/hw/i2c/trace-events
70
+ '-net', 'nic')
74
index XXXXXXX..XXXXXXX 100644
71
+ self.vm.launch()
75
--- a/hw/i2c/trace-events
72
+
76
+++ b/hw/i2c/trace-events
73
+ self.wait_for_console_pattern("Booting Linux on physical CPU 0xf00")
77
@@ -XXX,XX +XXX,XX @@ i2c_recv(uint8_t address, uint8_t data) "recv(addr:0x%02x) data:0x%02x"
74
+ self.wait_for_console_pattern("SMP: Total of 2 processors activated")
78
# aspeed_i2c.c
75
+ self.wait_for_console_pattern("No filesystem could mount root")
79
76
+
80
aspeed_i2c_bus_cmd(uint32_t cmd, const char *cmd_flags, uint32_t count, uint32_t intr_status) "handling cmd=0x%x %s count=%d intr=0x%x"
77
+
81
-aspeed_i2c_bus_raise_interrupt(uint32_t intr_status, const char *str1, const char *str2, const char *str3, const char *str4, const char *str5, const char *str6) "handled intr=0x%x %s%s%s%s%s%s"
78
if __name__ == '__main__':
82
+aspeed_i2c_bus_raise_interrupt(uint32_t intr_status, const char *s) "handled intr=0x%x %s"
79
AspeedTest.main()
83
aspeed_i2c_bus_read(uint32_t busid, uint64_t offset, unsigned size, uint64_t value) "bus[%d]: To 0x%" PRIx64 " of size %u: 0x%" PRIx64
84
aspeed_i2c_bus_write(uint32_t busid, uint64_t offset, unsigned size, uint64_t value) "bus[%d]: To 0x%" PRIx64 " of size %u: 0x%" PRIx64
85
aspeed_i2c_bus_send(const char *mode, int i, int count, uint8_t byte) "%s send %d/%d 0x%02x"
86
--
80
--
87
2.35.3
81
2.47.1
88
82
89
83
diff view generated by jsdifflib
1
From: Klaus Jensen <k.jensen@samsung.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Add support for writing and reading the device address register in old
3
So far, the test cases are used for testing SMC model with AST2400 BMC.
4
register mode.
4
However, AST2400 is end off live and ASPEED is no longer support this SOC.
5
To test SMC model for AST2500, AST2600 and AST1030, move the test cases
6
from main to test_palmetto_bmc function.
5
7
6
On the AST2400 (only 1 slave address)
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-2-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
---
13
tests/qtest/aspeed_smc-test.c | 16 ++++++++++++----
14
1 file changed, 12 insertions(+), 4 deletions(-)
7
15
8
* no upper bits
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
9
10
On the AST2500 (2 possible slave addresses),
11
12
* bit[31] : Slave Address match indicator
13
* bit[30] : Slave Address Receiving pending
14
15
On the AST2600 (3 possible slave addresses),
16
17
* bit[31-30] : Slave Address match indicator
18
* bit[29] : Slave Address Receiving pending
19
20
The model could be more precise to take into account all fields but
21
since the Linux driver is masking the register value being set, it
22
should be fine. See commit 3fb2e2aeafb2 ("i2c: aspeed: disable
23
additional device addresses on ast2[56]xx") from Zeiv. This can be
24
addressed later.
25
26
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
27
[ clg: add details to commit log ]
28
Message-Id: <20220601210831.67259-3-its@irrelevant.dk>
29
Signed-off-by: Cédric Le Goater <clg@kaod.org>
30
---
31
include/hw/i2c/aspeed_i2c.h | 8 ++++++++
32
hw/i2c/aspeed_i2c.c | 4 ++--
33
2 files changed, 10 insertions(+), 2 deletions(-)
34
35
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
36
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
37
--- a/include/hw/i2c/aspeed_i2c.h
18
--- a/tests/qtest/aspeed_smc-test.c
38
+++ b/include/hw/i2c/aspeed_i2c.h
19
+++ b/tests/qtest/aspeed_smc-test.c
39
@@ -XXX,XX +XXX,XX @@ static inline uint32_t aspeed_i2c_bus_cmd_offset(AspeedI2CBus *bus)
20
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
40
return R_I2CD_CMD;
21
flash_reset();
41
}
22
}
42
23
43
+static inline uint32_t aspeed_i2c_bus_dev_addr_offset(AspeedI2CBus *bus)
24
-int main(int argc, char **argv)
44
+{
25
+static int test_palmetto_bmc(void)
45
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
26
{
46
+ return R_I2CS_DEV_ADDR;
27
g_autofree char *tmp_path = NULL;
47
+ }
28
int ret;
48
+ return R_I2CD_DEV_ADDR;
29
int fd;
30
31
- g_test_init(&argc, &argv, NULL);
32
-
33
fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
34
g_assert(fd >= 0);
35
ret = ftruncate(fd, FLASH_SIZE);
36
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
37
38
flash_reset();
39
ret = g_test_run();
40
-
41
qtest_quit(global_qtest);
42
unlink(tmp_path);
43
+
44
+ return ret;
49
+}
45
+}
50
+
46
+
51
static inline uint32_t aspeed_i2c_bus_intr_ctrl_offset(AspeedI2CBus *bus)
47
+int main(int argc, char **argv)
52
{
48
+{
53
if (aspeed_i2c_is_new_mode(bus->controller)) {
49
+ int ret;
54
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
50
+
55
index XXXXXXX..XXXXXXX 100644
51
+ g_test_init(&argc, &argv, NULL);
56
--- a/hw/i2c/aspeed_i2c.c
52
+ ret = test_palmetto_bmc();
57
+++ b/hw/i2c/aspeed_i2c.c
53
+
58
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_old_read(AspeedI2CBus *bus, hwaddr offset,
54
return ret;
59
case A_I2CD_AC_TIMING2:
55
}
60
case A_I2CD_INTR_CTRL:
61
case A_I2CD_INTR_STS:
62
+ case A_I2CD_DEV_ADDR:
63
case A_I2CD_POOL_CTRL:
64
case A_I2CD_BYTE_BUF:
65
/* Value is already set, don't do anything. */
66
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_old_write(AspeedI2CBus *bus, hwaddr offset,
67
}
68
break;
69
case A_I2CD_DEV_ADDR:
70
- qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
71
- __func__);
72
+ bus->regs[R_I2CD_DEV_ADDR] = value;
73
break;
74
case A_I2CD_POOL_CTRL:
75
bus->regs[R_I2CD_POOL_CTRL] &= ~0xffffff;
76
--
56
--
77
2.35.3
57
2.47.1
78
58
79
59
diff view generated by jsdifflib
1
From: Joe Komlodi <komlodi@google.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
On AST2600, I2C has a secondary mode, called "new mode", which changes
3
Currently, these test cases are only used for testing fmc_cs0 for AST2400.
4
the layout of registers, adds some minor behavior changes, and
4
To test others BMC SOCs, introduces a new TestData structure.
5
introduces a new way to transfer data called "packet mode".
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.
6
7
7
Most of the bit positions of the fields are the same between old and new
8
Introduce new helper functions to make the test case more readable.
8
mode, so we use SHARED_FIELD_XX macros to reuse most of the code between
9
the different modes.
10
9
11
For packet mode, most of the command behavior is the same compared to
10
Set spi base address 0x1E620000, flash_base address 0x20000000
12
other modes, but there are some minor changes to how interrupts are
11
and jedec id 0x20ba19 for fmc_cs0 with n25q256a flash for AST2400
13
handled compared to other modes.
12
SMC model testing.
14
13
15
Signed-off-by: Joe Komlodi <komlodi@google.com>
14
To pass the TestData into the test case, replace qtest_add_func with
16
Change-Id: I072f8301964f623afc74af1fe50c12e5caef199e
15
qtest_add_data_func.
17
Message-Id: <20220331043248.2237838-6-komlodi@google.com>
16
18
Signed-off-by: Cédric Le Goater <clg@kaod.org>
17
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
18
Reviewed-by: Cédric Le Goater <clg@redhat.com>
19
Link: https://lore.kernel.org/r/20241127091543.1243114-3-jamin_lin@aspeedtech.com
20
Signed-off-by: Cédric Le Goater <clg@redhat.com>
19
---
21
---
20
include/hw/i2c/aspeed_i2c.h | 4 +-
22
tests/qtest/aspeed_smc-test.c | 546 +++++++++++++++++++---------------
21
hw/i2c/aspeed_i2c.c | 844 +++++++++++++++++++++++++++---------
23
1 file changed, 299 insertions(+), 247 deletions(-)
22
2 files changed, 653 insertions(+), 195 deletions(-)
23
24
24
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
25
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
25
index XXXXXXX..XXXXXXX 100644
26
index XXXXXXX..XXXXXXX 100644
26
--- a/include/hw/i2c/aspeed_i2c.h
27
--- a/tests/qtest/aspeed_smc-test.c
27
+++ b/include/hw/i2c/aspeed_i2c.h
28
+++ b/tests/qtest/aspeed_smc-test.c
28
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C)
29
@@ -XXX,XX +XXX,XX @@
29
#define ASPEED_I2C_NR_BUSSES 16
30
#define CTRL_USERMODE 0x3
30
#define ASPEED_I2C_MAX_POOL_SIZE 0x800
31
#define SR_WEL BIT(1)
31
#define ASPEED_I2C_OLD_NUM_REG 11
32
32
+#define ASPEED_I2C_NEW_NUM_REG 22
33
-#define ASPEED_FMC_BASE 0x1E620000
33
34
-#define ASPEED_FLASH_BASE 0x20000000
34
struct AspeedI2CState;
35
-
35
36
/*
36
@@ -XXX,XX +XXX,XX @@ struct AspeedI2CBus {
37
* Flash commands
37
uint8_t id;
38
*/
38
qemu_irq irq;
39
@@ -XXX,XX +XXX,XX @@ enum {
39
40
ERASE_SECTOR = 0xd8,
40
- uint32_t regs[ASPEED_I2C_OLD_NUM_REG];
41
+ uint32_t regs[ASPEED_I2C_NEW_NUM_REG];
42
};
41
};
43
42
44
struct AspeedI2CState {
43
-#define FLASH_JEDEC 0x20ba19 /* n25q256a */
45
@@ -XXX,XX +XXX,XX @@ struct AspeedI2CState {
44
-#define FLASH_SIZE (32 * 1024 * 1024)
46
45
-
47
uint32_t intr_status;
46
#define FLASH_PAGE_SIZE 256
48
uint32_t ctrl_global;
47
49
+ uint32_t new_clk_divider;
48
+typedef struct TestData {
50
MemoryRegion pool_iomem;
49
+ QTestState *s;
51
uint8_t pool[ASPEED_I2C_MAX_POOL_SIZE];
50
+ uint64_t spi_base;
52
51
+ uint64_t flash_base;
53
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
52
+ uint32_t jedec_id;
54
index XXXXXXX..XXXXXXX 100644
53
+ char *tmp_path;
55
--- a/hw/i2c/aspeed_i2c.c
54
+} TestData;
56
+++ b/hw/i2c/aspeed_i2c.c
57
@@ -XXX,XX +XXX,XX @@
58
#include "hw/registerfields.h"
59
#include "trace.h"
60
61
+/* Tx State Machine */
62
+#define I2CD_TX_STATE_MASK 0xf
63
+#define I2CD_IDLE 0x0
64
+#define I2CD_MACTIVE 0x8
65
+#define I2CD_MSTART 0x9
66
+#define I2CD_MSTARTR 0xa
67
+#define I2CD_MSTOP 0xb
68
+#define I2CD_MTXD 0xc
69
+#define I2CD_MRXACK 0xd
70
+#define I2CD_MRXD 0xe
71
+#define I2CD_MTXACK 0xf
72
+#define I2CD_SWAIT 0x1
73
+#define I2CD_SRXD 0x4
74
+#define I2CD_STXACK 0x5
75
+#define I2CD_STXD 0x6
76
+#define I2CD_SRXACK 0x7
77
+#define I2CD_RECOVER 0x3
78
+
55
+
79
/* I2C Global Register */
56
/*
80
REG32(I2C_CTRL_STATUS, 0x0) /* Device Interrupt Status */
57
* Use an explicit bswap for the values read/wrote to the flash region
81
REG32(I2C_CTRL_ASSIGN, 0x8) /* Device Interrupt Target Assignment */
58
* as they are BE and the Aspeed CPU is LE.
82
REG32(I2C_CTRL_GLOBAL, 0xC) /* Global Control Register */
59
@@ -XXX,XX +XXX,XX @@ static inline uint32_t make_be32(uint32_t data)
83
+ FIELD(I2C_CTRL_GLOBAL, REG_MODE, 2, 1)
60
return bswap32(data);
84
FIELD(I2C_CTRL_GLOBAL, SRAM_EN, 0, 1)
61
}
85
+REG32(I2C_CTRL_NEW_CLK_DIVIDER, 0x10) /* New mode clock divider */
62
86
63
-static void spi_conf(uint32_t value)
87
-/* I2C Device (Bus) Register */
64
+static inline void spi_writel(const TestData *data, uint64_t offset,
88
+/* I2C Old Mode Device (Bus) Register */
65
+ uint32_t value)
89
REG32(I2CD_FUN_CTRL, 0x0) /* I2CD Function Control */
90
FIELD(I2CD_FUN_CTRL, POOL_PAGE_SEL, 20, 3) /* AST2400 */
91
- FIELD(I2CD_FUN_CTRL, M_SDA_LOCK_EN, 16, 1)
92
- FIELD(I2CD_FUN_CTRL, MULTI_MASTER_DIS, 15, 1)
93
- FIELD(I2CD_FUN_CTRL, M_SCL_DRIVE_EN, 14, 1)
94
- FIELD(I2CD_FUN_CTRL, MSB_STS, 9, 1)
95
- FIELD(I2CD_FUN_CTRL, SDA_DRIVE_IT_EN, 8, 1)
96
- FIELD(I2CD_FUN_CTRL, M_SDA_DRIVE_IT_EN, 7, 1)
97
- FIELD(I2CD_FUN_CTRL, M_HIGH_SPEED_EN, 6, 1)
98
- FIELD(I2CD_FUN_CTRL, DEF_ADDR_EN, 5, 1)
99
- FIELD(I2CD_FUN_CTRL, DEF_ALERT_EN, 4, 1)
100
- FIELD(I2CD_FUN_CTRL, DEF_ARP_EN, 3, 1)
101
- FIELD(I2CD_FUN_CTRL, DEF_GCALL_EN, 2, 1)
102
- FIELD(I2CD_FUN_CTRL, SLAVE_EN, 1, 1)
103
- FIELD(I2CD_FUN_CTRL, MASTER_EN, 0, 1)
104
+ SHARED_FIELD(M_SDA_LOCK_EN, 16, 1)
105
+ SHARED_FIELD(MULTI_MASTER_DIS, 15, 1)
106
+ SHARED_FIELD(M_SCL_DRIVE_EN, 14, 1)
107
+ SHARED_FIELD(MSB_STS, 9, 1)
108
+ SHARED_FIELD(SDA_DRIVE_IT_EN, 8, 1)
109
+ SHARED_FIELD(M_SDA_DRIVE_IT_EN, 7, 1)
110
+ SHARED_FIELD(M_HIGH_SPEED_EN, 6, 1)
111
+ SHARED_FIELD(DEF_ADDR_EN, 5, 1)
112
+ SHARED_FIELD(DEF_ALERT_EN, 4, 1)
113
+ SHARED_FIELD(DEF_ARP_EN, 3, 1)
114
+ SHARED_FIELD(DEF_GCALL_EN, 2, 1)
115
+ SHARED_FIELD(SLAVE_EN, 1, 1)
116
+ SHARED_FIELD(MASTER_EN, 0, 1)
117
REG32(I2CD_AC_TIMING1, 0x04) /* Clock and AC Timing Control #1 */
118
REG32(I2CD_AC_TIMING2, 0x08) /* Clock and AC Timing Control #2 */
119
REG32(I2CD_INTR_CTRL, 0x0C) /* I2CD Interrupt Control */
120
REG32(I2CD_INTR_STS, 0x10) /* I2CD Interrupt Status */
121
- FIELD(I2CD_INTR_STS, SLAVE_ADDR_MATCH, 31, 1) /* 0: addr1 1: addr2 */
122
- FIELD(I2CD_INTR_STS, SLAVE_ADDR_RX_PENDING, 29, 1)
123
- FIELD(I2CD_INTR_STS, SLAVE_INACTIVE_TIMEOUT, 15, 1)
124
- FIELD(I2CD_INTR_STS, SDA_DL_TIMEOUT, 14, 1)
125
- FIELD(I2CD_INTR_STS, BUS_RECOVER_DONE, 13, 1)
126
- FIELD(I2CD_INTR_STS, SMBUS_ALERT, 12, 1) /* Bus [0-3] only */
127
+ SHARED_FIELD(SLAVE_ADDR_MATCH, 31, 1) /* 0: addr1 1: addr2 */
128
+ SHARED_FIELD(SLAVE_ADDR_RX_PENDING, 29, 1)
129
+ SHARED_FIELD(SLAVE_INACTIVE_TIMEOUT, 15, 1)
130
+ SHARED_FIELD(SDA_DL_TIMEOUT, 14, 1)
131
+ SHARED_FIELD(BUS_RECOVER_DONE, 13, 1)
132
+ SHARED_FIELD(SMBUS_ALERT, 12, 1) /* Bus [0-3] only */
133
FIELD(I2CD_INTR_STS, SMBUS_ARP_ADDR, 11, 1) /* Removed */
134
FIELD(I2CD_INTR_STS, SMBUS_DEV_ALERT_ADDR, 10, 1) /* Removed */
135
FIELD(I2CD_INTR_STS, SMBUS_DEF_ADDR, 9, 1) /* Removed */
136
FIELD(I2CD_INTR_STS, GCALL_ADDR, 8, 1) /* Removed */
137
FIELD(I2CD_INTR_STS, SLAVE_ADDR_RX_MATCH, 7, 1) /* use RX_DONE */
138
- FIELD(I2CD_INTR_STS, SCL_TIMEOUT, 6, 1)
139
- FIELD(I2CD_INTR_STS, ABNORMAL, 5, 1)
140
- FIELD(I2CD_INTR_STS, NORMAL_STOP, 4, 1)
141
- FIELD(I2CD_INTR_STS, ARBIT_LOSS, 3, 1)
142
- FIELD(I2CD_INTR_STS, RX_DONE, 2, 1)
143
- FIELD(I2CD_INTR_STS, TX_NAK, 1, 1)
144
- FIELD(I2CD_INTR_STS, TX_ACK, 0, 1)
145
+ SHARED_FIELD(SCL_TIMEOUT, 6, 1)
146
+ SHARED_FIELD(ABNORMAL, 5, 1)
147
+ SHARED_FIELD(NORMAL_STOP, 4, 1)
148
+ SHARED_FIELD(ARBIT_LOSS, 3, 1)
149
+ SHARED_FIELD(RX_DONE, 2, 1)
150
+ SHARED_FIELD(TX_NAK, 1, 1)
151
+ SHARED_FIELD(TX_ACK, 0, 1)
152
REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
153
- FIELD(I2CD_CMD, SDA_OE, 28, 1)
154
- FIELD(I2CD_CMD, SDA_O, 27, 1)
155
- FIELD(I2CD_CMD, SCL_OE, 26, 1)
156
- FIELD(I2CD_CMD, SCL_O, 25, 1)
157
- FIELD(I2CD_CMD, TX_TIMING, 23, 2)
158
- FIELD(I2CD_CMD, TX_STATE, 19, 4)
159
-/* Tx State Machine */
160
-#define I2CD_TX_STATE_MASK 0xf
161
-#define I2CD_IDLE 0x0
162
-#define I2CD_MACTIVE 0x8
163
-#define I2CD_MSTART 0x9
164
-#define I2CD_MSTARTR 0xa
165
-#define I2CD_MSTOP 0xb
166
-#define I2CD_MTXD 0xc
167
-#define I2CD_MRXACK 0xd
168
-#define I2CD_MRXD 0xe
169
-#define I2CD_MTXACK 0xf
170
-#define I2CD_SWAIT 0x1
171
-#define I2CD_SRXD 0x4
172
-#define I2CD_STXACK 0x5
173
-#define I2CD_STXD 0x6
174
-#define I2CD_SRXACK 0x7
175
-#define I2CD_RECOVER 0x3
176
- FIELD(I2CD_CMD, SCL_LINE_STS, 18, 1)
177
- FIELD(I2CD_CMD, SDA_LINE_STS, 17, 1)
178
- FIELD(I2CD_CMD, BUS_BUSY_STS, 16, 1)
179
- FIELD(I2CD_CMD, SDA_OE_OUT_DIR, 15, 1)
180
- FIELD(I2CD_CMD, SDA_O_OUT_DIR, 14, 1)
181
- FIELD(I2CD_CMD, SCL_OE_OUT_DIR, 13, 1)
182
- FIELD(I2CD_CMD, SCL_O_OUT_DIR, 12, 1)
183
- FIELD(I2CD_CMD, BUS_RECOVER_CMD_EN, 11, 1)
184
- FIELD(I2CD_CMD, S_ALT_EN, 10, 1)
185
+ SHARED_FIELD(SDA_OE, 28, 1)
186
+ SHARED_FIELD(SDA_O, 27, 1)
187
+ SHARED_FIELD(SCL_OE, 26, 1)
188
+ SHARED_FIELD(SCL_O, 25, 1)
189
+ SHARED_FIELD(TX_TIMING, 23, 2)
190
+ SHARED_FIELD(TX_STATE, 19, 4)
191
+ SHARED_FIELD(SCL_LINE_STS, 18, 1)
192
+ SHARED_FIELD(SDA_LINE_STS, 17, 1)
193
+ SHARED_FIELD(BUS_BUSY_STS, 16, 1)
194
+ SHARED_FIELD(SDA_OE_OUT_DIR, 15, 1)
195
+ SHARED_FIELD(SDA_O_OUT_DIR, 14, 1)
196
+ SHARED_FIELD(SCL_OE_OUT_DIR, 13, 1)
197
+ SHARED_FIELD(SCL_O_OUT_DIR, 12, 1)
198
+ SHARED_FIELD(BUS_RECOVER_CMD_EN, 11, 1)
199
+ SHARED_FIELD(S_ALT_EN, 10, 1)
200
/* Command Bits */
201
- FIELD(I2CD_CMD, RX_DMA_EN, 9, 1)
202
- FIELD(I2CD_CMD, TX_DMA_EN, 8, 1)
203
- FIELD(I2CD_CMD, RX_BUFF_EN, 7, 1)
204
- FIELD(I2CD_CMD, TX_BUFF_EN, 6, 1)
205
- FIELD(I2CD_CMD, M_STOP_CMD, 5, 1)
206
- FIELD(I2CD_CMD, M_S_RX_CMD_LAST, 4, 1)
207
- FIELD(I2CD_CMD, M_RX_CMD, 3, 1)
208
- FIELD(I2CD_CMD, S_TX_CMD, 2, 1)
209
- FIELD(I2CD_CMD, M_TX_CMD, 1, 1)
210
- FIELD(I2CD_CMD, M_START_CMD, 0, 1)
211
+ SHARED_FIELD(RX_DMA_EN, 9, 1)
212
+ SHARED_FIELD(TX_DMA_EN, 8, 1)
213
+ SHARED_FIELD(RX_BUFF_EN, 7, 1)
214
+ SHARED_FIELD(TX_BUFF_EN, 6, 1)
215
+ SHARED_FIELD(M_STOP_CMD, 5, 1)
216
+ SHARED_FIELD(M_S_RX_CMD_LAST, 4, 1)
217
+ SHARED_FIELD(M_RX_CMD, 3, 1)
218
+ SHARED_FIELD(S_TX_CMD, 2, 1)
219
+ SHARED_FIELD(M_TX_CMD, 1, 1)
220
+ SHARED_FIELD(M_START_CMD, 0, 1)
221
REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
222
REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
223
- FIELD(I2CD_POOL_CTRL, RX_COUNT, 24, 5)
224
- FIELD(I2CD_POOL_CTRL, RX_SIZE, 16, 5)
225
- FIELD(I2CD_POOL_CTRL, TX_COUNT, 9, 5)
226
+ SHARED_FIELD(RX_COUNT, 24, 5)
227
+ SHARED_FIELD(RX_SIZE, 16, 5)
228
+ SHARED_FIELD(TX_COUNT, 9, 5)
229
FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
230
REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
231
- FIELD(I2CD_BYTE_BUF, RX_BUF, 8, 8)
232
- FIELD(I2CD_BYTE_BUF, TX_BUF, 0, 8)
233
+ SHARED_FIELD(RX_BUF, 8, 8)
234
+ SHARED_FIELD(TX_BUF, 0, 8)
235
REG32(I2CD_DMA_ADDR, 0x24) /* DMA Buffer Address */
236
REG32(I2CD_DMA_LEN, 0x28) /* DMA Transfer Length < 4KB */
237
238
+/* I2C New Mode Device (Bus) Register */
239
+REG32(I2CC_FUN_CTRL, 0x0)
240
+ FIELD(I2CC_FUN_CTRL, RB_EARLY_DONE_EN, 22, 1)
241
+ FIELD(I2CC_FUN_CTRL, DMA_DIS_AUTO_RECOVER, 21, 1)
242
+ FIELD(I2CC_FUN_CTRL, S_SAVE_ADDR, 20, 1)
243
+ FIELD(I2CC_FUN_CTRL, M_PKT_RETRY_CNT, 18, 2)
244
+ /* 17:0 shared with I2CD_FUN_CTRL[17:0] */
245
+REG32(I2CC_AC_TIMING, 0x04)
246
+REG32(I2CC_MS_TXRX_BYTE_BUF, 0x08)
247
+ /* 31:16 shared with I2CD_CMD[31:16] */
248
+ /* 15:0 shared with I2CD_BYTE_BUF[15:0] */
249
+REG32(I2CC_POOL_CTRL, 0x0c)
250
+ /* 31:0 shared with I2CD_POOL_CTRL[31:0] */
251
+REG32(I2CM_INTR_CTRL, 0x10)
252
+REG32(I2CM_INTR_STS, 0x14)
253
+ FIELD(I2CM_INTR_STS, PKT_STATE, 28, 4)
254
+ FIELD(I2CM_INTR_STS, PKT_CMD_TIMEOUT, 18, 1)
255
+ FIELD(I2CM_INTR_STS, PKT_CMD_FAIL, 17, 1)
256
+ FIELD(I2CM_INTR_STS, PKT_CMD_DONE, 16, 1)
257
+ FIELD(I2CM_INTR_STS, BUS_RECOVER_FAIL, 15, 1)
258
+ /* 14:0 shared with I2CD_INTR_STS[14:0] */
259
+REG32(I2CM_CMD, 0x18)
260
+ FIELD(I2CM_CMD, W1_CTRL, 31, 1)
261
+ FIELD(I2CM_CMD, PKT_DEV_ADDR, 24, 7)
262
+ FIELD(I2CM_CMD, HS_MASTER_MODE_LSB, 17, 3)
263
+ FIELD(I2CM_CMD, PKT_OP_EN, 16, 1)
264
+ /* 15:0 shared with I2CD_CMD[15:0] */
265
+REG32(I2CM_DMA_LEN, 0x1c)
266
+ FIELD(I2CM_DMA_LEN, RX_BUF_LEN_W1T, 31, 1)
267
+ FIELD(I2CM_DMA_LEN, RX_BUF_LEN, 16, 11)
268
+ FIELD(I2CM_DMA_LEN, TX_BUF_LEN_W1T, 15, 1)
269
+ FIELD(I2CM_DMA_LEN, TX_BUF_LEN, 0, 11)
270
+REG32(I2CS_INTR_CTRL, 0x20)
271
+REG32(I2CS_INTR_STS, 0x24)
272
+ /* 31:29 shared with I2CD_INTR_STS[31:29] */
273
+ FIELD(I2CS_INTR_STS, SLAVE_PARKING_STS, 24, 2)
274
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR3_NAK, 22, 1)
275
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR2_NAK, 21, 1)
276
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR1_NAK, 20, 1)
277
+ FIELD(I2CS_INTR_STS, SLAVE_ADDR_INDICATOR, 18, 2)
278
+ FIELD(I2CS_INTR_STS, PKT_CMD_FAIL, 17, 1)
279
+ FIELD(I2CS_INTR_STS, PKT_CMD_DONE, 16, 1)
280
+ /* 14:0 shared with I2CD_INTR_STS[14:0] */
281
+REG32(I2CS_CMD, 0x28)
282
+ FIELD(I2CS_CMD, W1_CTRL, 31, 1)
283
+ FIELD(I2CS_CMD, PKT_MODE_ACTIVE_ADDR, 17, 2)
284
+ FIELD(I2CS_CMD, PKT_MODE_EN, 16, 1)
285
+ FIELD(I2CS_CMD, AUTO_NAK_INACTIVE_ADDR, 15, 1)
286
+ FIELD(I2CS_CMD, AUTO_NAK_ACTIVE_ADDR, 14, 1)
287
+ /* 13:0 shared with I2CD_CMD[13:0] */
288
+REG32(I2CS_DMA_LEN, 0x2c)
289
+ FIELD(I2CS_DMA_LEN, RX_BUF_LEN_W1T, 31, 1)
290
+ FIELD(I2CS_DMA_LEN, RX_BUF_LEN, 16, 11)
291
+ FIELD(I2CS_DMA_LEN, TX_BUF_LEN_W1T, 15, 1)
292
+ FIELD(I2CS_DMA_LEN, TX_BUF_LEN, 0, 11)
293
+REG32(I2CM_DMA_TX_ADDR, 0x30)
294
+ FIELD(I2CM_DMA_TX_ADDR, ADDR, 0, 31)
295
+REG32(I2CM_DMA_RX_ADDR, 0x34)
296
+ FIELD(I2CM_DMA_RX_ADDR, ADDR, 0, 31)
297
+REG32(I2CS_DMA_TX_ADDR, 0x38)
298
+ FIELD(I2CS_DMA_TX_ADDR, ADDR, 0, 31)
299
+REG32(I2CS_DMA_RX_ADDR, 0x3c)
300
+ FIELD(I2CS_DMA_RX_ADDR, ADDR, 0, 31)
301
+REG32(I2CS_DEV_ADDR, 0x40)
302
+REG32(I2CM_DMA_LEN_STS, 0x48)
303
+ FIELD(I2CM_DMA_LEN_STS, RX_LEN, 16, 13)
304
+ FIELD(I2CM_DMA_LEN_STS, TX_LEN, 0, 13)
305
+REG32(I2CS_DMA_LEN_STS, 0x4c)
306
+ FIELD(I2CS_DMA_LEN_STS, RX_LEN, 16, 13)
307
+ FIELD(I2CS_DMA_LEN_STS, TX_LEN, 0, 13)
308
+REG32(I2CC_DMA_ADDR, 0x50)
309
+REG32(I2CC_DMA_LEN, 0x54)
310
+
311
+static inline bool aspeed_i2c_is_new_mode(AspeedI2CState *s)
312
+{
66
+{
313
+ return FIELD_EX32(s->ctrl_global, I2C_CTRL_GLOBAL, REG_MODE);
67
+ qtest_writel(data->s, data->spi_base + offset, value);
314
+}
68
+}
315
+
69
+
316
+static inline bool aspeed_i2c_bus_pkt_mode_en(AspeedI2CBus *bus)
70
+static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
317
+{
71
+{
318
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
72
+ return qtest_readl(data->s, data->spi_base + offset);
319
+ return ARRAY_FIELD_EX32(bus->regs, I2CM_CMD, PKT_OP_EN);
320
+ }
321
+ return false;
322
+}
73
+}
323
+
74
+
324
+static inline uint32_t aspeed_i2c_bus_ctrl_offset(AspeedI2CBus *bus)
75
+static inline void flash_writeb(const TestData *data, uint64_t offset,
76
+ uint8_t value)
325
+{
77
+{
326
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
78
+ qtest_writeb(data->s, data->flash_base + offset, value);
327
+ return R_I2CC_FUN_CTRL;
328
+ }
329
+ return R_I2CD_FUN_CTRL;
330
+}
79
+}
331
+
80
+
332
+static inline uint32_t aspeed_i2c_bus_cmd_offset(AspeedI2CBus *bus)
81
+static inline void flash_writel(const TestData *data, uint64_t offset,
82
+ uint32_t value)
333
+{
83
+{
334
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
84
+ qtest_writel(data->s, data->flash_base + offset, value);
335
+ return R_I2CM_CMD;
336
+ }
337
+ return R_I2CD_CMD;
338
+}
85
+}
339
+
86
+
340
+static inline uint32_t aspeed_i2c_bus_intr_ctrl_offset(AspeedI2CBus *bus)
87
+static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
341
+{
88
{
342
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
89
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
343
+ return R_I2CM_INTR_CTRL;
90
+ return qtest_readb(data->s, data->flash_base + offset);
344
+ }
345
+ return R_I2CD_INTR_CTRL;
346
+}
91
+}
347
+
92
+
348
+static inline uint32_t aspeed_i2c_bus_intr_sts_offset(AspeedI2CBus *bus)
93
+static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
349
+{
94
+{
350
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
95
+ return qtest_readl(data->s, data->flash_base + offset);
351
+ return R_I2CM_INTR_STS;
352
+ }
353
+ return R_I2CD_INTR_STS;
354
+}
96
+}
355
+
97
+
356
+static inline uint32_t aspeed_i2c_bus_pool_ctrl_offset(AspeedI2CBus *bus)
98
+static void spi_conf(const TestData *data, uint32_t value)
357
+{
99
+{
358
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
100
+ uint32_t conf = spi_readl(data, R_CONF);
359
+ return R_I2CC_POOL_CTRL;
101
360
+ }
102
conf |= value;
361
+ return R_I2CD_POOL_CTRL;
103
- writel(ASPEED_FMC_BASE + R_CONF, conf);
362
+}
104
+ spi_writel(data, R_CONF, conf);
105
}
106
107
-static void spi_conf_remove(uint32_t value)
108
+static void spi_conf_remove(const TestData *data, uint32_t value)
109
{
110
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CONF);
111
+ uint32_t conf = spi_readl(data, R_CONF);
112
113
conf &= ~value;
114
- writel(ASPEED_FMC_BASE + R_CONF, conf);
115
+ spi_writel(data, R_CONF, conf);
116
}
117
118
-static void spi_ce_ctrl(uint32_t value)
119
+static void spi_ce_ctrl(const TestData *data, uint32_t value)
120
{
121
- uint32_t conf = readl(ASPEED_FMC_BASE + R_CE_CTRL);
122
+ uint32_t conf = spi_readl(data, R_CE_CTRL);
123
124
conf |= value;
125
- writel(ASPEED_FMC_BASE + R_CE_CTRL, conf);
126
+ spi_writel(data, R_CE_CTRL, conf);
127
}
128
129
-static void spi_ctrl_setmode(uint8_t mode, uint8_t cmd)
130
+static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
131
{
132
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
133
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
134
ctrl &= ~(CTRL_USERMODE | 0xff << 16);
135
ctrl |= mode | (cmd << 16);
136
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
137
+ spi_writel(data, R_CTRL0, ctrl);
138
}
139
140
-static void spi_ctrl_start_user(void)
141
+static void spi_ctrl_start_user(const TestData *data)
142
{
143
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
144
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
145
146
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
147
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
148
+ spi_writel(data, R_CTRL0, ctrl);
149
150
ctrl &= ~CTRL_CE_STOP_ACTIVE;
151
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
152
+ spi_writel(data, R_CTRL0, ctrl);
153
}
154
155
-static void spi_ctrl_stop_user(void)
156
+static void spi_ctrl_stop_user(const TestData *data)
157
{
158
- uint32_t ctrl = readl(ASPEED_FMC_BASE + R_CTRL0);
159
+ uint32_t ctrl = spi_readl(data, R_CTRL0);
160
161
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
162
- writel(ASPEED_FMC_BASE + R_CTRL0, ctrl);
163
+ spi_writel(data, R_CTRL0, ctrl);
164
}
165
166
-static void flash_reset(void)
167
+static void flash_reset(const TestData *data)
168
{
169
- spi_conf(CONF_ENABLE_W0);
170
+ spi_conf(data, CONF_ENABLE_W0);
171
172
- spi_ctrl_start_user();
173
- writeb(ASPEED_FLASH_BASE, RESET_ENABLE);
174
- writeb(ASPEED_FLASH_BASE, RESET_MEMORY);
175
- writeb(ASPEED_FLASH_BASE, WREN);
176
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
177
- writeb(ASPEED_FLASH_BASE, WRDI);
178
- spi_ctrl_stop_user();
179
+ spi_ctrl_start_user(data);
180
+ flash_writeb(data, 0, RESET_ENABLE);
181
+ flash_writeb(data, 0, RESET_MEMORY);
182
+ flash_writeb(data, 0, WREN);
183
+ flash_writeb(data, 0, BULK_ERASE);
184
+ flash_writeb(data, 0, WRDI);
185
+ spi_ctrl_stop_user(data);
186
187
- spi_conf_remove(CONF_ENABLE_W0);
188
+ spi_conf_remove(data, CONF_ENABLE_W0);
189
}
190
191
-static void test_read_jedec(void)
192
+static void test_read_jedec(const void *data)
193
{
194
+ const TestData *test_data = (const TestData *)data;
195
uint32_t jedec = 0x0;
196
197
- spi_conf(CONF_ENABLE_W0);
198
+ spi_conf(test_data, CONF_ENABLE_W0);
199
200
- spi_ctrl_start_user();
201
- writeb(ASPEED_FLASH_BASE, JEDEC_READ);
202
- jedec |= readb(ASPEED_FLASH_BASE) << 16;
203
- jedec |= readb(ASPEED_FLASH_BASE) << 8;
204
- jedec |= readb(ASPEED_FLASH_BASE);
205
- spi_ctrl_stop_user();
206
+ spi_ctrl_start_user(test_data);
207
+ flash_writeb(test_data, 0, JEDEC_READ);
208
+ jedec |= flash_readb(test_data, 0) << 16;
209
+ jedec |= flash_readb(test_data, 0) << 8;
210
+ jedec |= flash_readb(test_data, 0);
211
+ spi_ctrl_stop_user(test_data);
212
213
- flash_reset();
214
+ flash_reset(test_data);
215
216
- g_assert_cmphex(jedec, ==, FLASH_JEDEC);
217
+ g_assert_cmphex(jedec, ==, test_data->jedec_id);
218
}
219
220
-static void read_page(uint32_t addr, uint32_t *page)
221
+static void read_page(const TestData *data, uint32_t addr, uint32_t *page)
222
{
223
int i;
224
225
- spi_ctrl_start_user();
226
+ spi_ctrl_start_user(data);
227
228
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
229
- writeb(ASPEED_FLASH_BASE, READ);
230
- writel(ASPEED_FLASH_BASE, make_be32(addr));
231
+ flash_writeb(data, 0, EN_4BYTE_ADDR);
232
+ flash_writeb(data, 0, READ);
233
+ flash_writel(data, 0, make_be32(addr));
234
235
/* Continuous read are supported */
236
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
237
- page[i] = make_be32(readl(ASPEED_FLASH_BASE));
238
+ page[i] = make_be32(flash_readl(data, 0));
239
}
240
- spi_ctrl_stop_user();
241
+ spi_ctrl_stop_user(data);
242
}
243
244
-static void read_page_mem(uint32_t addr, uint32_t *page)
245
+static void read_page_mem(const TestData *data, uint32_t addr, uint32_t *page)
246
{
247
int i;
248
249
/* move out USER mode to use direct reads from the AHB bus */
250
- spi_ctrl_setmode(CTRL_READMODE, READ);
251
+ spi_ctrl_setmode(data, CTRL_READMODE, READ);
252
253
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
254
- page[i] = make_be32(readl(ASPEED_FLASH_BASE + addr + i * 4));
255
+ page[i] = make_be32(flash_readl(data, addr + i * 4));
256
}
257
}
258
259
-static void write_page_mem(uint32_t addr, uint32_t write_value)
260
+static void write_page_mem(const TestData *data, uint32_t addr,
261
+ uint32_t write_value)
262
{
263
- spi_ctrl_setmode(CTRL_WRITEMODE, PP);
264
+ spi_ctrl_setmode(data, CTRL_WRITEMODE, PP);
265
266
for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
267
- writel(ASPEED_FLASH_BASE + addr + i * 4, write_value);
268
+ flash_writel(data, addr + i * 4, write_value);
269
}
270
}
271
272
-static void assert_page_mem(uint32_t addr, uint32_t expected_value)
273
+static void assert_page_mem(const TestData *data, uint32_t addr,
274
+ uint32_t expected_value)
275
{
276
uint32_t page[FLASH_PAGE_SIZE / 4];
277
- read_page_mem(addr, page);
278
+ read_page_mem(data, addr, page);
279
for (int i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
280
g_assert_cmphex(page[i], ==, expected_value);
281
}
282
}
283
284
-static void test_erase_sector(void)
285
+static void test_erase_sector(const void *data)
286
{
287
+ const TestData *test_data = (const TestData *)data;
288
uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
289
uint32_t page[FLASH_PAGE_SIZE / 4];
290
int i;
291
292
- spi_conf(CONF_ENABLE_W0);
293
+ spi_conf(test_data, CONF_ENABLE_W0);
294
295
/*
296
* Previous page should be full of 0xffs after backend is
297
* initialized
298
*/
299
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
300
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
301
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
302
g_assert_cmphex(page[i], ==, 0xffffffff);
303
}
304
305
- spi_ctrl_start_user();
306
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
307
- writeb(ASPEED_FLASH_BASE, WREN);
308
- writeb(ASPEED_FLASH_BASE, PP);
309
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
310
+ spi_ctrl_start_user(test_data);
311
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
312
+ flash_writeb(test_data, 0, WREN);
313
+ flash_writeb(test_data, 0, PP);
314
+ flash_writel(test_data, 0, make_be32(some_page_addr));
315
316
/* Fill the page with its own addresses */
317
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
318
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
319
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
320
}
321
- spi_ctrl_stop_user();
322
+ spi_ctrl_stop_user(test_data);
323
324
/* Check the page is correctly written */
325
- read_page(some_page_addr, page);
326
+ read_page(test_data, some_page_addr, page);
327
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
328
g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
329
}
330
331
- spi_ctrl_start_user();
332
- writeb(ASPEED_FLASH_BASE, WREN);
333
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
334
- writeb(ASPEED_FLASH_BASE, ERASE_SECTOR);
335
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
336
- spi_ctrl_stop_user();
337
+ spi_ctrl_start_user(test_data);
338
+ flash_writeb(test_data, 0, WREN);
339
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
340
+ flash_writeb(test_data, 0, ERASE_SECTOR);
341
+ flash_writel(test_data, 0, make_be32(some_page_addr));
342
+ spi_ctrl_stop_user(test_data);
343
344
/* Check the page is erased */
345
- read_page(some_page_addr, page);
346
+ read_page(test_data, some_page_addr, page);
347
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
348
g_assert_cmphex(page[i], ==, 0xffffffff);
349
}
350
351
- flash_reset();
352
+ flash_reset(test_data);
353
}
354
355
-static void test_erase_all(void)
356
+static void test_erase_all(const void *data)
357
{
358
+ const TestData *test_data = (const TestData *)data;
359
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
360
uint32_t page[FLASH_PAGE_SIZE / 4];
361
int i;
362
363
- spi_conf(CONF_ENABLE_W0);
364
+ spi_conf(test_data, CONF_ENABLE_W0);
365
366
/*
367
* Previous page should be full of 0xffs after backend is
368
* initialized
369
*/
370
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
371
+ read_page(test_data, some_page_addr - FLASH_PAGE_SIZE, page);
372
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
373
g_assert_cmphex(page[i], ==, 0xffffffff);
374
}
375
376
- spi_ctrl_start_user();
377
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
378
- writeb(ASPEED_FLASH_BASE, WREN);
379
- writeb(ASPEED_FLASH_BASE, PP);
380
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
381
+ spi_ctrl_start_user(test_data);
382
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
383
+ flash_writeb(test_data, 0, WREN);
384
+ flash_writeb(test_data, 0, PP);
385
+ flash_writel(test_data, 0, make_be32(some_page_addr));
386
387
/* Fill the page with its own addresses */
388
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
389
- writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
390
+ flash_writel(test_data, 0, make_be32(some_page_addr + i * 4));
391
}
392
- spi_ctrl_stop_user();
393
+ spi_ctrl_stop_user(test_data);
394
395
/* Check the page is correctly written */
396
- read_page(some_page_addr, page);
397
+ read_page(test_data, some_page_addr, page);
398
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
399
g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
400
}
401
402
- spi_ctrl_start_user();
403
- writeb(ASPEED_FLASH_BASE, WREN);
404
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
405
- spi_ctrl_stop_user();
406
+ spi_ctrl_start_user(test_data);
407
+ flash_writeb(test_data, 0, WREN);
408
+ flash_writeb(test_data, 0, BULK_ERASE);
409
+ spi_ctrl_stop_user(test_data);
410
411
/* Check the page is erased */
412
- read_page(some_page_addr, page);
413
+ read_page(test_data, some_page_addr, page);
414
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
415
g_assert_cmphex(page[i], ==, 0xffffffff);
416
}
417
418
- flash_reset();
419
+ flash_reset(test_data);
420
}
421
422
-static void test_write_page(void)
423
+static void test_write_page(const void *data)
424
{
425
+ const TestData *test_data = (const TestData *)data;
426
uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
427
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
428
uint32_t page[FLASH_PAGE_SIZE / 4];
429
int i;
430
431
- spi_conf(CONF_ENABLE_W0);
432
+ spi_conf(test_data, CONF_ENABLE_W0);
433
434
- spi_ctrl_start_user();
435
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
436
- writeb(ASPEED_FLASH_BASE, WREN);
437
- writeb(ASPEED_FLASH_BASE, PP);
438
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
439
+ spi_ctrl_start_user(test_data);
440
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
441
+ flash_writeb(test_data, 0, WREN);
442
+ flash_writeb(test_data, 0, PP);
443
+ flash_writel(test_data, 0, make_be32(my_page_addr));
444
445
/* Fill the page with its own addresses */
446
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
447
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
448
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
449
}
450
- spi_ctrl_stop_user();
451
+ spi_ctrl_stop_user(test_data);
452
453
/* Check what was written */
454
- read_page(my_page_addr, page);
455
+ read_page(test_data, my_page_addr, page);
456
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
457
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
458
}
459
460
/* Check some other page. It should be full of 0xff */
461
- read_page(some_page_addr, page);
462
+ read_page(test_data, some_page_addr, page);
463
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
464
g_assert_cmphex(page[i], ==, 0xffffffff);
465
}
466
467
- flash_reset();
468
+ flash_reset(test_data);
469
}
470
471
-static void test_read_page_mem(void)
472
+static void test_read_page_mem(const void *data)
473
{
474
+ const TestData *test_data = (const TestData *)data;
475
uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
476
uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
477
uint32_t page[FLASH_PAGE_SIZE / 4];
478
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(void)
479
* Enable 4BYTE mode for controller. This is should be strapped by
480
* HW for CE0 anyhow.
481
*/
482
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
483
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
484
485
/* Enable 4BYTE mode for flash. */
486
- spi_conf(CONF_ENABLE_W0);
487
- spi_ctrl_start_user();
488
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
489
- writeb(ASPEED_FLASH_BASE, WREN);
490
- writeb(ASPEED_FLASH_BASE, PP);
491
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
492
+ spi_conf(test_data, CONF_ENABLE_W0);
493
+ spi_ctrl_start_user(test_data);
494
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
495
+ flash_writeb(test_data, 0, WREN);
496
+ flash_writeb(test_data, 0, PP);
497
+ flash_writel(test_data, 0, make_be32(my_page_addr));
498
499
/* Fill the page with its own addresses */
500
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
501
- writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
502
+ flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
503
}
504
- spi_ctrl_stop_user();
505
- spi_conf_remove(CONF_ENABLE_W0);
506
+ spi_ctrl_stop_user(test_data);
507
+ spi_conf_remove(test_data, CONF_ENABLE_W0);
508
509
/* Check what was written */
510
- read_page_mem(my_page_addr, page);
511
+ read_page_mem(test_data, my_page_addr, page);
512
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
513
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
514
}
515
516
/* Check some other page. It should be full of 0xff */
517
- read_page_mem(some_page_addr, page);
518
+ read_page_mem(test_data, some_page_addr, page);
519
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
520
g_assert_cmphex(page[i], ==, 0xffffffff);
521
}
522
523
- flash_reset();
524
+ flash_reset(test_data);
525
}
526
527
-static void test_write_page_mem(void)
528
+static void test_write_page_mem(const void *data)
529
{
530
+ const TestData *test_data = (const TestData *)data;
531
uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
532
uint32_t page[FLASH_PAGE_SIZE / 4];
533
int i;
534
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(void)
535
* Enable 4BYTE mode for controller. This is should be strapped by
536
* HW for CE0 anyhow.
537
*/
538
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
539
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
540
541
/* Enable 4BYTE mode for flash. */
542
- spi_conf(CONF_ENABLE_W0);
543
- spi_ctrl_start_user();
544
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
545
- writeb(ASPEED_FLASH_BASE, WREN);
546
- spi_ctrl_stop_user();
547
+ spi_conf(test_data, CONF_ENABLE_W0);
548
+ spi_ctrl_start_user(test_data);
549
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
550
+ flash_writeb(test_data, 0, WREN);
551
+ spi_ctrl_stop_user(test_data);
552
553
/* move out USER mode to use direct writes to the AHB bus */
554
- spi_ctrl_setmode(CTRL_WRITEMODE, PP);
555
+ spi_ctrl_setmode(test_data, CTRL_WRITEMODE, PP);
556
557
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
558
- writel(ASPEED_FLASH_BASE + my_page_addr + i * 4,
559
+ flash_writel(test_data, my_page_addr + i * 4,
560
make_be32(my_page_addr + i * 4));
561
}
562
563
/* Check what was written */
564
- read_page_mem(my_page_addr, page);
565
+ read_page_mem(test_data, my_page_addr, page);
566
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
567
g_assert_cmphex(page[i], ==, my_page_addr + i * 4);
568
}
569
570
- flash_reset();
571
+ flash_reset(test_data);
572
}
573
574
-static void test_read_status_reg(void)
575
+static void test_read_status_reg(const void *data)
576
{
577
+ const TestData *test_data = (const TestData *)data;
578
uint8_t r;
579
580
- spi_conf(CONF_ENABLE_W0);
581
+ spi_conf(test_data, CONF_ENABLE_W0);
582
583
- spi_ctrl_start_user();
584
- writeb(ASPEED_FLASH_BASE, RDSR);
585
- r = readb(ASPEED_FLASH_BASE);
586
- spi_ctrl_stop_user();
587
+ spi_ctrl_start_user(test_data);
588
+ flash_writeb(test_data, 0, RDSR);
589
+ r = flash_readb(test_data, 0);
590
+ spi_ctrl_stop_user(test_data);
591
592
g_assert_cmphex(r & SR_WEL, ==, 0);
593
g_assert(!qtest_qom_get_bool
594
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
595
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
596
597
- spi_ctrl_start_user();
598
- writeb(ASPEED_FLASH_BASE, WREN);
599
- writeb(ASPEED_FLASH_BASE, RDSR);
600
- r = readb(ASPEED_FLASH_BASE);
601
- spi_ctrl_stop_user();
602
+ spi_ctrl_start_user(test_data);
603
+ flash_writeb(test_data, 0, WREN);
604
+ flash_writeb(test_data, 0, RDSR);
605
+ r = flash_readb(test_data, 0);
606
+ spi_ctrl_stop_user(test_data);
607
608
g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
609
g_assert(qtest_qom_get_bool
610
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
611
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
612
613
- spi_ctrl_start_user();
614
- writeb(ASPEED_FLASH_BASE, WRDI);
615
- writeb(ASPEED_FLASH_BASE, RDSR);
616
- r = readb(ASPEED_FLASH_BASE);
617
- spi_ctrl_stop_user();
618
+ spi_ctrl_start_user(test_data);
619
+ flash_writeb(test_data, 0, WRDI);
620
+ flash_writeb(test_data, 0, RDSR);
621
+ r = flash_readb(test_data, 0);
622
+ spi_ctrl_stop_user(test_data);
623
624
g_assert_cmphex(r & SR_WEL, ==, 0);
625
g_assert(!qtest_qom_get_bool
626
- (global_qtest, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
627
+ (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
628
629
- flash_reset();
630
+ flash_reset(test_data);
631
}
632
633
-static void test_status_reg_write_protection(void)
634
+static void test_status_reg_write_protection(const void *data)
635
{
636
+ const TestData *test_data = (const TestData *)data;
637
uint8_t r;
638
639
- spi_conf(CONF_ENABLE_W0);
640
+ spi_conf(test_data, CONF_ENABLE_W0);
641
642
/* default case: WP# is high and SRWD is low -> status register writable */
643
- spi_ctrl_start_user();
644
- writeb(ASPEED_FLASH_BASE, WREN);
645
+ spi_ctrl_start_user(test_data);
646
+ flash_writeb(test_data, 0, WREN);
647
/* test ability to write SRWD */
648
- writeb(ASPEED_FLASH_BASE, WRSR);
649
- writeb(ASPEED_FLASH_BASE, SRWD);
650
- writeb(ASPEED_FLASH_BASE, RDSR);
651
- r = readb(ASPEED_FLASH_BASE);
652
- spi_ctrl_stop_user();
653
+ flash_writeb(test_data, 0, WRSR);
654
+ flash_writeb(test_data, 0, SRWD);
655
+ flash_writeb(test_data, 0, RDSR);
656
+ r = flash_readb(test_data, 0);
657
+ spi_ctrl_stop_user(test_data);
658
g_assert_cmphex(r & SRWD, ==, SRWD);
659
660
/* WP# high and SRWD high -> status register writable */
661
- spi_ctrl_start_user();
662
- writeb(ASPEED_FLASH_BASE, WREN);
663
+ spi_ctrl_start_user(test_data);
664
+ flash_writeb(test_data, 0, WREN);
665
/* test ability to write SRWD */
666
- writeb(ASPEED_FLASH_BASE, WRSR);
667
- writeb(ASPEED_FLASH_BASE, 0);
668
- writeb(ASPEED_FLASH_BASE, RDSR);
669
- r = readb(ASPEED_FLASH_BASE);
670
- spi_ctrl_stop_user();
671
+ flash_writeb(test_data, 0, WRSR);
672
+ flash_writeb(test_data, 0, 0);
673
+ flash_writeb(test_data, 0, RDSR);
674
+ r = flash_readb(test_data, 0);
675
+ spi_ctrl_stop_user(test_data);
676
g_assert_cmphex(r & SRWD, ==, 0);
677
678
/* WP# low and SRWD low -> status register writable */
679
- qtest_set_irq_in(global_qtest,
680
+ qtest_set_irq_in(test_data->s,
681
"/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 0);
682
- spi_ctrl_start_user();
683
- writeb(ASPEED_FLASH_BASE, WREN);
684
+ spi_ctrl_start_user(test_data);
685
+ flash_writeb(test_data, 0, WREN);
686
/* test ability to write SRWD */
687
- writeb(ASPEED_FLASH_BASE, WRSR);
688
- writeb(ASPEED_FLASH_BASE, SRWD);
689
- writeb(ASPEED_FLASH_BASE, RDSR);
690
- r = readb(ASPEED_FLASH_BASE);
691
- spi_ctrl_stop_user();
692
+ flash_writeb(test_data, 0, WRSR);
693
+ flash_writeb(test_data, 0, SRWD);
694
+ flash_writeb(test_data, 0, RDSR);
695
+ r = flash_readb(test_data, 0);
696
+ spi_ctrl_stop_user(test_data);
697
g_assert_cmphex(r & SRWD, ==, SRWD);
698
699
/* WP# low and SRWD high -> status register NOT writable */
700
- spi_ctrl_start_user();
701
- writeb(ASPEED_FLASH_BASE, WREN);
702
+ spi_ctrl_start_user(test_data);
703
+ flash_writeb(test_data, 0 , WREN);
704
/* test ability to write SRWD */
705
- writeb(ASPEED_FLASH_BASE, WRSR);
706
- writeb(ASPEED_FLASH_BASE, 0);
707
- writeb(ASPEED_FLASH_BASE, RDSR);
708
- r = readb(ASPEED_FLASH_BASE);
709
- spi_ctrl_stop_user();
710
+ flash_writeb(test_data, 0, WRSR);
711
+ flash_writeb(test_data, 0, 0);
712
+ flash_writeb(test_data, 0, RDSR);
713
+ r = flash_readb(test_data, 0);
714
+ spi_ctrl_stop_user(test_data);
715
/* write is not successful */
716
g_assert_cmphex(r & SRWD, ==, SRWD);
717
718
- qtest_set_irq_in(global_qtest,
719
+ qtest_set_irq_in(test_data->s,
720
"/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 1);
721
- flash_reset();
722
+ flash_reset(test_data);
723
}
724
725
-static void test_write_block_protect(void)
726
+static void test_write_block_protect(const void *data)
727
{
728
+ const TestData *test_data = (const TestData *)data;
729
uint32_t sector_size = 65536;
730
uint32_t n_sectors = 512;
731
732
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
733
- spi_conf(CONF_ENABLE_W0);
734
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
735
+ spi_conf(test_data, CONF_ENABLE_W0);
736
737
uint32_t bp_bits = 0b0;
738
739
for (int i = 0; i < 16; i++) {
740
bp_bits = ((i & 0b1000) << 3) | ((i & 0b0111) << 2);
741
742
- spi_ctrl_start_user();
743
- writeb(ASPEED_FLASH_BASE, WREN);
744
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
745
- writeb(ASPEED_FLASH_BASE, WREN);
746
- writeb(ASPEED_FLASH_BASE, WRSR);
747
- writeb(ASPEED_FLASH_BASE, bp_bits);
748
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
749
- writeb(ASPEED_FLASH_BASE, WREN);
750
- spi_ctrl_stop_user();
751
+ spi_ctrl_start_user(test_data);
752
+ flash_writeb(test_data, 0, WREN);
753
+ flash_writeb(test_data, 0, BULK_ERASE);
754
+ flash_writeb(test_data, 0, WREN);
755
+ flash_writeb(test_data, 0, WRSR);
756
+ flash_writeb(test_data, 0, bp_bits);
757
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
758
+ flash_writeb(test_data, 0, WREN);
759
+ spi_ctrl_stop_user(test_data);
760
761
uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
762
uint32_t protection_start = n_sectors - num_protected_sectors;
763
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect(void)
764
for (int sector = 0; sector < n_sectors; sector++) {
765
uint32_t addr = sector * sector_size;
766
767
- assert_page_mem(addr, 0xffffffff);
768
- write_page_mem(addr, make_be32(0xabcdef12));
769
+ assert_page_mem(test_data, addr, 0xffffffff);
770
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
771
772
uint32_t expected_value = protection_start <= sector
773
&& sector < protection_end
774
? 0xffffffff : 0xabcdef12;
775
776
- assert_page_mem(addr, expected_value);
777
+ assert_page_mem(test_data, addr, expected_value);
778
}
779
}
780
781
- flash_reset();
782
+ flash_reset(test_data);
783
}
784
785
-static void test_write_block_protect_bottom_bit(void)
786
+static void test_write_block_protect_bottom_bit(const void *data)
787
{
788
+ const TestData *test_data = (const TestData *)data;
789
uint32_t sector_size = 65536;
790
uint32_t n_sectors = 512;
791
792
- spi_ce_ctrl(1 << CRTL_EXTENDED0);
793
- spi_conf(CONF_ENABLE_W0);
794
+ spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
795
+ spi_conf(test_data, CONF_ENABLE_W0);
796
797
/* top bottom bit is enabled */
798
uint32_t bp_bits = 0b00100 << 3;
799
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
800
for (int i = 0; i < 16; i++) {
801
bp_bits = (((i & 0b1000) | 0b0100) << 3) | ((i & 0b0111) << 2);
802
803
- spi_ctrl_start_user();
804
- writeb(ASPEED_FLASH_BASE, WREN);
805
- writeb(ASPEED_FLASH_BASE, BULK_ERASE);
806
- writeb(ASPEED_FLASH_BASE, WREN);
807
- writeb(ASPEED_FLASH_BASE, WRSR);
808
- writeb(ASPEED_FLASH_BASE, bp_bits);
809
- writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
810
- writeb(ASPEED_FLASH_BASE, WREN);
811
- spi_ctrl_stop_user();
812
+ spi_ctrl_start_user(test_data);
813
+ flash_writeb(test_data, 0, WREN);
814
+ flash_writeb(test_data, 0, BULK_ERASE);
815
+ flash_writeb(test_data, 0, WREN);
816
+ flash_writeb(test_data, 0, WRSR);
817
+ flash_writeb(test_data, 0, bp_bits);
818
+ flash_writeb(test_data, 0, EN_4BYTE_ADDR);
819
+ flash_writeb(test_data, 0, WREN);
820
+ spi_ctrl_stop_user(test_data);
821
822
uint32_t num_protected_sectors = i ? MIN(1 << (i - 1), n_sectors) : 0;
823
uint32_t protection_start = 0;
824
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(void)
825
for (int sector = 0; sector < n_sectors; sector++) {
826
uint32_t addr = sector * sector_size;
827
828
- assert_page_mem(addr, 0xffffffff);
829
- write_page_mem(addr, make_be32(0xabcdef12));
830
+ assert_page_mem(test_data, addr, 0xffffffff);
831
+ write_page_mem(test_data, addr, make_be32(0xabcdef12));
832
833
uint32_t expected_value = protection_start <= sector
834
&& sector < protection_end
835
? 0xffffffff : 0xabcdef12;
836
837
- assert_page_mem(addr, expected_value);
838
+ assert_page_mem(test_data, addr, expected_value);
839
}
840
}
841
842
- flash_reset();
843
+ flash_reset(test_data);
844
}
845
846
-static int test_palmetto_bmc(void)
847
+static void test_palmetto_bmc(TestData *data)
848
{
849
- g_autofree char *tmp_path = NULL;
850
int ret;
851
int fd;
852
853
- fd = g_file_open_tmp("qtest.m25p80.XXXXXX", &tmp_path, NULL);
854
+ fd = g_file_open_tmp("qtest.m25p80.n25q256a.XXXXXX", &data->tmp_path, NULL);
855
g_assert(fd >= 0);
856
- ret = ftruncate(fd, FLASH_SIZE);
857
+ ret = ftruncate(fd, 32 * 1024 * 1024);
858
g_assert(ret == 0);
859
close(fd);
860
861
- global_qtest = qtest_initf("-m 256 -machine palmetto-bmc "
862
- "-drive file=%s,format=raw,if=mtd",
863
- tmp_path);
864
-
865
- qtest_add_func("/ast2400/smc/read_jedec", test_read_jedec);
866
- qtest_add_func("/ast2400/smc/erase_sector", test_erase_sector);
867
- qtest_add_func("/ast2400/smc/erase_all", test_erase_all);
868
- qtest_add_func("/ast2400/smc/write_page", test_write_page);
869
- qtest_add_func("/ast2400/smc/read_page_mem", test_read_page_mem);
870
- qtest_add_func("/ast2400/smc/write_page_mem", test_write_page_mem);
871
- qtest_add_func("/ast2400/smc/read_status_reg", test_read_status_reg);
872
- qtest_add_func("/ast2400/smc/status_reg_write_protection",
873
- test_status_reg_write_protection);
874
- qtest_add_func("/ast2400/smc/write_block_protect",
875
- test_write_block_protect);
876
- qtest_add_func("/ast2400/smc/write_block_protect_bottom_bit",
877
- test_write_block_protect_bottom_bit);
878
-
879
- flash_reset();
880
- ret = g_test_run();
881
- qtest_quit(global_qtest);
882
- unlink(tmp_path);
883
-
884
- return ret;
885
+ data->s = qtest_initf("-m 256 -machine palmetto-bmc "
886
+ "-drive file=%s,format=raw,if=mtd",
887
+ data->tmp_path);
363
+
888
+
364
+static inline uint32_t aspeed_i2c_bus_byte_buf_offset(AspeedI2CBus *bus)
889
+ /* fmc cs0 with n25q256a flash */
365
+{
890
+ data->flash_base = 0x20000000;
366
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
891
+ data->spi_base = 0x1E620000;
367
+ return R_I2CC_MS_TXRX_BYTE_BUF;
892
+ data->jedec_id = 0x20ba19;
368
+ }
369
+ return R_I2CD_BYTE_BUF;
370
+}
371
+
893
+
372
+static inline uint32_t aspeed_i2c_bus_dma_len_offset(AspeedI2CBus *bus)
894
+ qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
373
+{
895
+ qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
374
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
896
+ qtest_add_data_func("/ast2400/smc/erase_all", data, test_erase_all);
375
+ return R_I2CC_DMA_LEN;
897
+ qtest_add_data_func("/ast2400/smc/write_page", data, test_write_page);
376
+ }
898
+ qtest_add_data_func("/ast2400/smc/read_page_mem",
377
+ return R_I2CD_DMA_LEN;
899
+ data, test_read_page_mem);
378
+}
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();
379
+
922
+
380
+static inline uint32_t aspeed_i2c_bus_dma_addr_offset(AspeedI2CBus *bus)
923
+ qtest_quit(palmetto_data.s);
381
+{
924
+ unlink(palmetto_data.tmp_path);
382
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
383
+ return R_I2CC_DMA_ADDR;
384
+ }
385
+ return R_I2CD_DMA_ADDR;
386
+}
387
+
388
static inline bool aspeed_i2c_bus_is_master(AspeedI2CBus *bus)
389
{
390
- return ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, MASTER_EN);
391
+ return SHARED_ARRAY_FIELD_EX32(bus->regs, aspeed_i2c_bus_ctrl_offset(bus),
392
+ MASTER_EN);
393
}
394
395
static inline bool aspeed_i2c_bus_is_enabled(AspeedI2CBus *bus)
396
{
397
- return ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, MASTER_EN) ||
398
- ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, SLAVE_EN);
399
+ uint32_t ctrl_reg = aspeed_i2c_bus_ctrl_offset(bus);
400
+ return SHARED_ARRAY_FIELD_EX32(bus->regs, ctrl_reg, MASTER_EN) ||
401
+ SHARED_ARRAY_FIELD_EX32(bus->regs, ctrl_reg, SLAVE_EN);
402
}
403
404
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
405
{
406
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
407
-
408
- trace_aspeed_i2c_bus_raise_interrupt(bus->regs[R_I2CD_INTR_STS],
409
- ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, TX_NAK) ? "nak|" : "",
410
- ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, TX_ACK) ? "ack|" : "",
411
- ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, RX_DONE) ? "done|" : "",
412
- ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, NORMAL_STOP) ? "normal|"
413
+ uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
414
+ uint32_t intr_ctrl_reg = aspeed_i2c_bus_intr_ctrl_offset(bus);
415
+ bool raise_irq;
416
+
417
+ trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts],
418
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_NAK) ? "nak|" : "",
419
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_ACK) ? "ack|" : "",
420
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ? "done|"
421
: "",
422
- ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, ABNORMAL) ? "abnormal"
423
- : "");
424
-
425
- bus->regs[R_I2CD_INTR_STS] &= bus->regs[R_I2CD_INTR_CTRL];
426
- if (bus->regs[R_I2CD_INTR_STS]) {
427
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, NORMAL_STOP) ?
428
+ "normal|" : "",
429
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, ABNORMAL) ? "abnormal"
430
+ : "");
431
+ raise_irq = bus->regs[reg_intr_sts] & bus->regs[intr_ctrl_reg];
432
+ /* In packet mode we don't mask off INTR_STS */
433
+ if (!aspeed_i2c_bus_pkt_mode_en(bus)) {
434
+ bus->regs[reg_intr_sts] &= bus->regs[intr_ctrl_reg];
435
+ }
436
+ if (raise_irq) {
437
bus->controller->intr_status |= 1 << bus->id;
438
qemu_irq_raise(aic->bus_get_irq(bus));
439
}
440
}
441
442
-static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
443
- unsigned size)
444
+static uint64_t aspeed_i2c_bus_old_read(AspeedI2CBus *bus, hwaddr offset,
445
+ unsigned size)
446
{
447
- AspeedI2CBus *bus = opaque;
448
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
449
uint64_t value = bus->regs[offset / sizeof(*bus->regs)];
450
451
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
452
/* Value is already set, don't do anything. */
453
break;
454
case A_I2CD_CMD:
455
- value = FIELD_DP32(value, I2CD_CMD, BUS_BUSY_STS,
456
- i2c_bus_busy(bus->bus));
457
+ value = SHARED_FIELD_DP32(value, BUS_BUSY_STS, i2c_bus_busy(bus->bus));
458
break;
459
case A_I2CD_DMA_ADDR:
460
if (!aic->has_dma) {
461
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
462
return value;
463
}
464
465
+static uint64_t aspeed_i2c_bus_new_read(AspeedI2CBus *bus, hwaddr offset,
466
+ unsigned size)
467
+{
468
+ uint64_t value = bus->regs[offset / sizeof(*bus->regs)];
469
+
470
+ switch (offset) {
471
+ case A_I2CC_FUN_CTRL:
472
+ case A_I2CC_AC_TIMING:
473
+ case A_I2CC_POOL_CTRL:
474
+ case A_I2CM_INTR_CTRL:
475
+ case A_I2CM_INTR_STS:
476
+ case A_I2CC_MS_TXRX_BYTE_BUF:
477
+ case A_I2CM_DMA_LEN:
478
+ case A_I2CM_DMA_TX_ADDR:
479
+ case A_I2CM_DMA_RX_ADDR:
480
+ case A_I2CM_DMA_LEN_STS:
481
+ case A_I2CC_DMA_ADDR:
482
+ case A_I2CC_DMA_LEN:
483
+ /* Value is already set, don't do anything. */
484
+ break;
485
+ case A_I2CM_CMD:
486
+ value = SHARED_FIELD_DP32(value, BUS_BUSY_STS, i2c_bus_busy(bus->bus));
487
+ break;
488
+ default:
489
+ qemu_log_mask(LOG_GUEST_ERROR,
490
+ "%s: Bad offset 0x%" HWADDR_PRIx "\n", __func__, offset);
491
+ value = -1;
492
+ break;
493
+ }
494
+
495
+ trace_aspeed_i2c_bus_read(bus->id, offset, size, value);
496
+ return value;
497
+}
498
+
499
+static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
500
+ unsigned size)
501
+{
502
+ AspeedI2CBus *bus = opaque;
503
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
504
+ return aspeed_i2c_bus_new_read(bus, offset, size);
505
+ }
506
+ return aspeed_i2c_bus_old_read(bus, offset, size);
507
+}
508
+
509
static void aspeed_i2c_set_state(AspeedI2CBus *bus, uint8_t state)
510
{
511
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, TX_STATE, state);
512
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
513
+ SHARED_ARRAY_FIELD_DP32(bus->regs, R_I2CC_MS_TXRX_BYTE_BUF, TX_STATE,
514
+ state);
515
+ } else {
516
+ SHARED_ARRAY_FIELD_DP32(bus->regs, R_I2CD_CMD, TX_STATE, state);
517
+ }
518
}
519
520
static uint8_t aspeed_i2c_get_state(AspeedI2CBus *bus)
521
{
522
- return ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_STATE);
523
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
524
+ return SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CC_MS_TXRX_BYTE_BUF,
525
+ TX_STATE);
526
+ }
527
+ return SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CD_CMD, TX_STATE);
528
}
529
530
static int aspeed_i2c_dma_read(AspeedI2CBus *bus, uint8_t *data)
531
{
532
MemTxResult result;
533
AspeedI2CState *s = bus->controller;
534
+ uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
535
+ uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
536
537
- result = address_space_read(&s->dram_as, bus->regs[R_I2CD_DMA_ADDR],
538
+ result = address_space_read(&s->dram_as, bus->regs[reg_dma_addr],
539
MEMTXATTRS_UNSPECIFIED, data, 1);
540
if (result != MEMTX_OK) {
541
qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM read failed @%08x\n",
542
- __func__, bus->regs[R_I2CD_DMA_ADDR]);
543
+ __func__, bus->regs[reg_dma_addr]);
544
return -1;
545
}
546
547
- bus->regs[R_I2CD_DMA_ADDR]++;
548
- bus->regs[R_I2CD_DMA_LEN]--;
549
+ bus->regs[reg_dma_addr]++;
550
+ bus->regs[reg_dma_len]--;
551
return 0;
552
}
553
554
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
555
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
556
int ret = -1;
557
int i;
558
- int pool_tx_count = ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, TX_COUNT);
559
-
560
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN)) {
561
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
562
+ uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
563
+ uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
564
+ uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
565
+ int pool_tx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
566
+ TX_COUNT);
567
+
568
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
569
for (i = pool_start; i < pool_tx_count; i++) {
570
uint8_t *pool_base = aic->bus_pool_base(bus);
571
572
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
573
break;
574
}
575
}
576
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, TX_BUFF_EN, 0);
577
- } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN)) {
578
- while (bus->regs[R_I2CD_DMA_LEN]) {
579
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, TX_BUFF_EN, 0);
580
+ } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
581
+ /* In new mode, clear how many bytes we TXed */
582
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
583
+ ARRAY_FIELD_DP32(bus->regs, I2CM_DMA_LEN_STS, TX_LEN, 0);
584
+ }
585
+ while (bus->regs[reg_dma_len]) {
586
uint8_t data;
587
aspeed_i2c_dma_read(bus, &data);
588
- trace_aspeed_i2c_bus_send("DMA", bus->regs[R_I2CD_DMA_LEN],
589
- bus->regs[R_I2CD_DMA_LEN], data);
590
+ trace_aspeed_i2c_bus_send("DMA", bus->regs[reg_dma_len],
591
+ bus->regs[reg_dma_len], data);
592
ret = i2c_send(bus->bus, data);
593
if (ret) {
594
break;
595
}
596
+ /* In new mode, keep track of how many bytes we TXed */
597
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
598
+ ARRAY_FIELD_DP32(bus->regs, I2CM_DMA_LEN_STS, TX_LEN,
599
+ ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN_STS,
600
+ TX_LEN) + 1);
601
+ }
602
}
603
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, TX_DMA_EN, 0);
604
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, TX_DMA_EN, 0);
605
} else {
606
trace_aspeed_i2c_bus_send("BYTE", pool_start, 1,
607
- bus->regs[R_I2CD_BYTE_BUF]);
608
- ret = i2c_send(bus->bus, bus->regs[R_I2CD_BYTE_BUF]);
609
+ bus->regs[reg_byte_buf]);
610
+ ret = i2c_send(bus->bus, bus->regs[reg_byte_buf]);
611
}
612
613
return ret;
925
return ret;
614
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
926
}
615
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
616
uint8_t data;
617
int i;
618
- int pool_rx_count = ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, RX_COUNT);
619
-
620
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN)) {
621
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
622
+ uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
623
+ uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
624
+ uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
625
+ uint32_t reg_dma_addr = aspeed_i2c_bus_dma_addr_offset(bus);
626
+ int pool_rx_count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl,
627
+ RX_COUNT);
628
+
629
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
630
uint8_t *pool_base = aic->bus_pool_base(bus);
631
632
for (i = 0; i < pool_rx_count; i++) {
633
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
634
}
635
636
/* Update RX count */
637
- ARRAY_FIELD_DP32(bus->regs, I2CD_POOL_CTRL, RX_COUNT, i & 0xff);
638
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, RX_BUFF_EN, 0);
639
- } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN)) {
640
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_pool_ctrl, RX_COUNT, i & 0xff);
641
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, RX_BUFF_EN, 0);
642
+ } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN)) {
643
uint8_t data;
644
+ /* In new mode, clear how many bytes we RXed */
645
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
646
+ ARRAY_FIELD_DP32(bus->regs, I2CM_DMA_LEN_STS, RX_LEN, 0);
647
+ }
648
649
- while (bus->regs[R_I2CD_DMA_LEN]) {
650
+ while (bus->regs[reg_dma_len]) {
651
MemTxResult result;
652
653
data = i2c_recv(bus->bus);
654
- trace_aspeed_i2c_bus_recv("DMA", bus->regs[R_I2CD_DMA_LEN],
655
- bus->regs[R_I2CD_DMA_LEN], data);
656
- result = address_space_write(&s->dram_as,
657
- bus->regs[R_I2CD_DMA_ADDR],
658
+ trace_aspeed_i2c_bus_recv("DMA", bus->regs[reg_dma_len],
659
+ bus->regs[reg_dma_len], data);
660
+ result = address_space_write(&s->dram_as, bus->regs[reg_dma_addr],
661
MEMTXATTRS_UNSPECIFIED, &data, 1);
662
if (result != MEMTX_OK) {
663
qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM write failed @%08x\n",
664
- __func__, bus->regs[R_I2CD_DMA_ADDR]);
665
+ __func__, bus->regs[reg_dma_addr]);
666
return;
667
}
668
- bus->regs[R_I2CD_DMA_ADDR]++;
669
- bus->regs[R_I2CD_DMA_LEN]--;
670
+ bus->regs[reg_dma_addr]++;
671
+ bus->regs[reg_dma_len]--;
672
+ /* In new mode, keep track of how many bytes we RXed */
673
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
674
+ ARRAY_FIELD_DP32(bus->regs, I2CM_DMA_LEN_STS, RX_LEN,
675
+ ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN_STS,
676
+ RX_LEN) + 1);
677
+ }
678
}
679
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, RX_DMA_EN, 0);
680
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, RX_DMA_EN, 0);
681
} else {
682
data = i2c_recv(bus->bus);
683
- trace_aspeed_i2c_bus_recv("BYTE", 1, 1, bus->regs[R_I2CD_BYTE_BUF]);
684
- ARRAY_FIELD_DP32(bus->regs, I2CD_BYTE_BUF, RX_BUF, data);
685
+ trace_aspeed_i2c_bus_recv("BYTE", 1, 1, bus->regs[reg_byte_buf]);
686
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_byte_buf, RX_BUF, data);
687
}
688
}
689
690
static void aspeed_i2c_handle_rx_cmd(AspeedI2CBus *bus)
691
{
692
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
693
+ uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
694
+
695
aspeed_i2c_set_state(bus, I2CD_MRXD);
696
aspeed_i2c_bus_recv(bus);
697
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, RX_DONE, 1);
698
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST)) {
699
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, RX_DONE, 1);
700
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_S_RX_CMD_LAST)) {
701
i2c_nack(bus->bus);
702
}
703
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_RX_CMD, 0);
704
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST, 0);
705
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_RX_CMD, 0);
706
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_S_RX_CMD_LAST, 0);
707
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
708
}
709
710
static uint8_t aspeed_i2c_get_addr(AspeedI2CBus *bus)
711
{
712
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
713
+ uint32_t reg_byte_buf = aspeed_i2c_bus_byte_buf_offset(bus);
714
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
715
716
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN)) {
717
+ if (aspeed_i2c_bus_pkt_mode_en(bus)) {
718
+ return (ARRAY_FIELD_EX32(bus->regs, I2CM_CMD, PKT_DEV_ADDR) << 1) |
719
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_RX_CMD);
720
+ }
721
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
722
uint8_t *pool_base = aic->bus_pool_base(bus);
723
724
return pool_base[0];
725
- } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN)) {
726
+ } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
727
uint8_t data;
728
729
aspeed_i2c_dma_read(bus, &data);
730
return data;
731
} else {
732
- return bus->regs[R_I2CD_BYTE_BUF];
733
+ return bus->regs[reg_byte_buf];
734
}
735
}
736
737
@@ -XXX,XX +XXX,XX @@ static bool aspeed_i2c_check_sram(AspeedI2CBus *bus)
738
{
739
AspeedI2CState *s = bus->controller;
740
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
741
- bool dma_en = ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN) ||
742
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN) ||
743
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN) ||
744
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN);
745
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
746
+ bool dma_en = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN) ||
747
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN) ||
748
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN) ||
749
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN);
750
if (!aic->check_sram) {
751
return true;
752
}
753
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
754
{
755
g_autofree char *cmd_flags = NULL;
756
uint32_t count;
757
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN)) {
758
- count = ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, TX_COUNT);
759
- } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN)) {
760
- count = bus->regs[R_I2CD_DMA_LEN];
761
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
762
+ uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
763
+ uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
764
+ uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
765
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN)) {
766
+ count = SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT);
767
+ } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN)) {
768
+ count = bus->regs[reg_dma_len];
769
} else { /* BYTE mode */
770
count = 1;
771
}
772
773
cmd_flags = g_strdup_printf("%s%s%s%s%s%s%s%s%s",
774
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_START_CMD) ? "start|" : "",
775
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN) ? "rxdma|" : "",
776
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN) ? "txdma|" : "",
777
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN) ? "rxbuf|" : "",
778
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN) ? "txbuf|" : "",
779
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_TX_CMD) ? "tx|" : "",
780
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_RX_CMD) ? "rx|" : "",
781
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST) ? "last|" : "",
782
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_STOP_CMD) ? "stop" : "");
783
-
784
- trace_aspeed_i2c_bus_cmd(bus->regs[R_I2CD_CMD], cmd_flags, count,
785
- bus->regs[R_I2CD_INTR_STS]);
786
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_START_CMD) ? "start|" : "",
787
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_DMA_EN) ? "rxdma|" : "",
788
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN) ? "txdma|" : "",
789
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, RX_BUFF_EN) ? "rxbuf|" : "",
790
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN) ? "txbuf|" : "",
791
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_TX_CMD) ? "tx|" : "",
792
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_RX_CMD) ? "rx|" : "",
793
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_S_RX_CMD_LAST) ? "last|" : "",
794
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_STOP_CMD) ? "stop|" : "");
795
+
796
+ trace_aspeed_i2c_bus_cmd(bus->regs[reg_cmd], cmd_flags, count,
797
+ bus->regs[reg_intr_sts]);
798
}
799
800
/*
801
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
802
static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
803
{
804
uint8_t pool_start = 0;
805
-
806
- bus->regs[R_I2CD_CMD] &= ~0xFFFF;
807
- bus->regs[R_I2CD_CMD] |= value & 0xFFFF;
808
+ uint32_t reg_intr_sts = aspeed_i2c_bus_intr_sts_offset(bus);
809
+ uint32_t reg_cmd = aspeed_i2c_bus_cmd_offset(bus);
810
+ uint32_t reg_pool_ctrl = aspeed_i2c_bus_pool_ctrl_offset(bus);
811
+ uint32_t reg_dma_len = aspeed_i2c_bus_dma_len_offset(bus);
812
813
if (!aspeed_i2c_check_sram(bus)) {
814
return;
815
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
816
aspeed_i2c_bus_cmd_dump(bus);
817
}
818
819
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_START_CMD)) {
820
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_START_CMD)) {
821
uint8_t state = aspeed_i2c_get_state(bus) & I2CD_MACTIVE ?
822
I2CD_MSTARTR : I2CD_MSTART;
823
uint8_t addr;
824
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
825
aspeed_i2c_set_state(bus, state);
826
827
addr = aspeed_i2c_get_addr(bus);
828
-
829
if (i2c_start_transfer(bus->bus, extract32(addr, 1, 7),
830
extract32(addr, 0, 1))) {
831
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_NAK, 1);
832
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, TX_NAK, 1);
833
+ if (aspeed_i2c_bus_pkt_mode_en(bus)) {
834
+ ARRAY_FIELD_DP32(bus->regs, I2CM_INTR_STS, PKT_CMD_FAIL, 1);
835
+ }
836
} else {
837
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_ACK, 1);
838
+ /* START doesn't set TX_ACK in packet mode */
839
+ if (!aspeed_i2c_bus_pkt_mode_en(bus)) {
840
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, TX_ACK, 1);
841
+ }
842
}
843
844
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_START_CMD, 0);
845
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_START_CMD, 0);
846
847
/*
848
* The START command is also a TX command, as the slave
849
* address is sent on the bus. Drop the TX flag if nothing
850
* else needs to be sent in this sequence.
851
*/
852
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN)) {
853
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, TX_COUNT) == 1) {
854
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
855
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_BUFF_EN)) {
856
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_pool_ctrl, TX_COUNT)
857
+ == 1) {
858
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
859
} else {
860
/*
861
* Increase the start index in the TX pool buffer to
862
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
863
*/
864
pool_start++;
865
}
866
- } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN)) {
867
- if (bus->regs[R_I2CD_DMA_LEN] == 0) {
868
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
869
+ } else if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, TX_DMA_EN)) {
870
+ if (bus->regs[reg_dma_len] == 0) {
871
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
872
}
873
} else {
874
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
875
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
876
}
877
878
/* No slave found */
879
if (!i2c_bus_busy(bus->bus)) {
880
+ if (aspeed_i2c_bus_pkt_mode_en(bus)) {
881
+ ARRAY_FIELD_DP32(bus->regs, I2CM_INTR_STS, PKT_CMD_FAIL, 1);
882
+ ARRAY_FIELD_DP32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE, 1);
883
+ }
884
return;
885
}
886
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
887
}
888
889
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_TX_CMD)) {
890
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_TX_CMD)) {
891
aspeed_i2c_set_state(bus, I2CD_MTXD);
892
if (aspeed_i2c_bus_send(bus, pool_start)) {
893
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_NAK, 1);
894
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, TX_NAK, 1);
895
i2c_end_transfer(bus->bus);
896
} else {
897
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_ACK, 1);
898
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, TX_ACK, 1);
899
}
900
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
901
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_TX_CMD, 0);
902
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
903
}
904
905
- if ((ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_RX_CMD) ||
906
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST)) &&
907
- !ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, RX_DONE)) {
908
+ if ((SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_RX_CMD) ||
909
+ SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_S_RX_CMD_LAST)) &&
910
+ !SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE)) {
911
aspeed_i2c_handle_rx_cmd(bus);
912
}
913
914
- if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_STOP_CMD)) {
915
+ if (SHARED_ARRAY_FIELD_EX32(bus->regs, reg_cmd, M_STOP_CMD)) {
916
if (!(aspeed_i2c_get_state(bus) & I2CD_MACTIVE)) {
917
qemu_log_mask(LOG_GUEST_ERROR, "%s: abnormal stop\n", __func__);
918
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, ABNORMAL, 1);
919
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, ABNORMAL, 1);
920
+ if (aspeed_i2c_bus_pkt_mode_en(bus)) {
921
+ ARRAY_FIELD_DP32(bus->regs, I2CM_INTR_STS, PKT_CMD_FAIL, 1);
922
+ }
923
} else {
924
aspeed_i2c_set_state(bus, I2CD_MSTOP);
925
i2c_end_transfer(bus->bus);
926
- ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, NORMAL_STOP, 1);
927
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_intr_sts, NORMAL_STOP, 1);
928
}
929
- ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_STOP_CMD, 0);
930
+ SHARED_ARRAY_FIELD_DP32(bus->regs, reg_cmd, M_STOP_CMD, 0);
931
aspeed_i2c_set_state(bus, I2CD_IDLE);
932
}
933
+
934
+ if (aspeed_i2c_bus_pkt_mode_en(bus)) {
935
+ ARRAY_FIELD_DP32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE, 1);
936
+ }
937
}
938
939
-static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
940
- uint64_t value, unsigned size)
941
+static void aspeed_i2c_bus_new_write(AspeedI2CBus *bus, hwaddr offset,
942
+ uint64_t value, unsigned size)
943
+{
944
+ AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
945
+ bool handle_rx;
946
+ bool w1t;
947
+
948
+ trace_aspeed_i2c_bus_write(bus->id, offset, size, value);
949
+
950
+ switch (offset) {
951
+ case A_I2CC_FUN_CTRL:
952
+ if (SHARED_FIELD_EX32(value, SLAVE_EN)) {
953
+ qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
954
+ __func__);
955
+ break;
956
+ }
957
+ bus->regs[R_I2CD_FUN_CTRL] = value & 0x007dc3ff;
958
+ break;
959
+ case A_I2CC_AC_TIMING:
960
+ bus->regs[R_I2CC_AC_TIMING] = value & 0x1ffff0ff;
961
+ break;
962
+ case A_I2CC_MS_TXRX_BYTE_BUF:
963
+ SHARED_ARRAY_FIELD_DP32(bus->regs, R_I2CC_MS_TXRX_BYTE_BUF, TX_BUF,
964
+ value);
965
+ break;
966
+ case A_I2CC_POOL_CTRL:
967
+ bus->regs[R_I2CC_POOL_CTRL] &= ~0xffffff;
968
+ bus->regs[R_I2CC_POOL_CTRL] |= (value & 0xffffff);
969
+ break;
970
+ case A_I2CM_INTR_CTRL:
971
+ bus->regs[R_I2CM_INTR_CTRL] = value & 0x0007f07f;
972
+ break;
973
+ case A_I2CM_INTR_STS:
974
+ handle_rx = SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CM_INTR_STS, RX_DONE)
975
+ && SHARED_FIELD_EX32(value, RX_DONE);
976
+
977
+ /* In packet mode, clearing PKT_CMD_DONE clears other interrupts. */
978
+ if (aspeed_i2c_bus_pkt_mode_en(bus) &&
979
+ FIELD_EX32(value, I2CM_INTR_STS, PKT_CMD_DONE)) {
980
+ bus->regs[R_I2CM_INTR_STS] &= 0xf0001000;
981
+ if (!bus->regs[R_I2CM_INTR_STS]) {
982
+ bus->controller->intr_status &= ~(1 << bus->id);
983
+ qemu_irq_lower(aic->bus_get_irq(bus));
984
+ }
985
+ break;
986
+ }
987
+ bus->regs[R_I2CM_INTR_STS] &= ~(value & 0xf007f07f);
988
+ if (!bus->regs[R_I2CM_INTR_STS]) {
989
+ bus->controller->intr_status &= ~(1 << bus->id);
990
+ qemu_irq_lower(aic->bus_get_irq(bus));
991
+ }
992
+ if (handle_rx && (SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CM_CMD,
993
+ M_RX_CMD) ||
994
+ SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CM_CMD,
995
+ M_S_RX_CMD_LAST))) {
996
+ aspeed_i2c_handle_rx_cmd(bus);
997
+ aspeed_i2c_bus_raise_interrupt(bus);
998
+ }
999
+ break;
1000
+ case A_I2CM_CMD:
1001
+ if (!aspeed_i2c_bus_is_enabled(bus)) {
1002
+ break;
1003
+ }
1004
+
1005
+ if (!aspeed_i2c_bus_is_master(bus)) {
1006
+ qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
1007
+ __func__);
1008
+ break;
1009
+ }
1010
+
1011
+ if (!aic->has_dma &&
1012
+ (SHARED_FIELD_EX32(value, RX_DMA_EN) ||
1013
+ SHARED_FIELD_EX32(value, TX_DMA_EN))) {
1014
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
1015
+ break;
1016
+ }
1017
+
1018
+ if (bus->regs[R_I2CM_INTR_STS] & 0xffff0000) {
1019
+ qemu_log_mask(LOG_UNIMP, "%s: Packet mode is not implemented\n",
1020
+ __func__);
1021
+ break;
1022
+ }
1023
+
1024
+ value &= 0xff0ffbfb;
1025
+ if (ARRAY_FIELD_EX32(bus->regs, I2CM_CMD, W1_CTRL)) {
1026
+ bus->regs[R_I2CM_CMD] |= value;
1027
+ } else {
1028
+ bus->regs[R_I2CM_CMD] = value;
1029
+ }
1030
+
1031
+ aspeed_i2c_bus_handle_cmd(bus, value);
1032
+ aspeed_i2c_bus_raise_interrupt(bus);
1033
+ break;
1034
+ case A_I2CM_DMA_TX_ADDR:
1035
+ bus->regs[R_I2CM_DMA_TX_ADDR] = FIELD_EX32(value, I2CM_DMA_TX_ADDR,
1036
+ ADDR);
1037
+ bus->regs[R_I2CC_DMA_ADDR] = FIELD_EX32(value, I2CM_DMA_TX_ADDR, ADDR);
1038
+ bus->regs[R_I2CC_DMA_LEN] = ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN,
1039
+ TX_BUF_LEN) + 1;
1040
+ break;
1041
+ case A_I2CM_DMA_RX_ADDR:
1042
+ bus->regs[R_I2CM_DMA_RX_ADDR] = FIELD_EX32(value, I2CM_DMA_RX_ADDR,
1043
+ ADDR);
1044
+ bus->regs[R_I2CC_DMA_ADDR] = FIELD_EX32(value, I2CM_DMA_RX_ADDR, ADDR);
1045
+ bus->regs[R_I2CC_DMA_LEN] = ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN,
1046
+ RX_BUF_LEN) + 1;
1047
+ break;
1048
+ case A_I2CM_DMA_LEN:
1049
+ w1t = ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN, RX_BUF_LEN_W1T) ||
1050
+ ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN, TX_BUF_LEN_W1T);
1051
+ /* If none of the w1t bits are set, just write to the reg as normal. */
1052
+ if (!w1t) {
1053
+ bus->regs[R_I2CM_DMA_LEN] = value;
1054
+ break;
1055
+ }
1056
+ if (ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN, RX_BUF_LEN_W1T)) {
1057
+ ARRAY_FIELD_DP32(bus->regs, I2CM_DMA_LEN, RX_BUF_LEN,
1058
+ FIELD_EX32(value, I2CM_DMA_LEN, RX_BUF_LEN));
1059
+ }
1060
+ if (ARRAY_FIELD_EX32(bus->regs, I2CM_DMA_LEN, TX_BUF_LEN_W1T)) {
1061
+ ARRAY_FIELD_DP32(bus->regs, I2CM_DMA_LEN, TX_BUF_LEN,
1062
+ FIELD_EX32(value, I2CM_DMA_LEN, TX_BUF_LEN));
1063
+ }
1064
+ break;
1065
+ case A_I2CM_DMA_LEN_STS:
1066
+ /* Writes clear to 0 */
1067
+ bus->regs[R_I2CM_DMA_LEN_STS] = 0;
1068
+ break;
1069
+ case A_I2CC_DMA_ADDR:
1070
+ case A_I2CC_DMA_LEN:
1071
+ /* RO */
1072
+ break;
1073
+ case A_I2CS_DMA_LEN_STS:
1074
+ case A_I2CS_DMA_TX_ADDR:
1075
+ case A_I2CS_DMA_RX_ADDR:
1076
+ case A_I2CS_DEV_ADDR:
1077
+ case A_I2CS_INTR_CTRL:
1078
+ case A_I2CS_INTR_STS:
1079
+ case A_I2CS_CMD:
1080
+ case A_I2CS_DMA_LEN:
1081
+ qemu_log_mask(LOG_UNIMP, "%s: Slave mode is not implemented\n",
1082
+ __func__);
1083
+ break;
1084
+ default:
1085
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
1086
+ __func__, offset);
1087
+ }
1088
+}
1089
+
1090
+static void aspeed_i2c_bus_old_write(AspeedI2CBus *bus, hwaddr offset,
1091
+ uint64_t value, unsigned size)
1092
{
1093
- AspeedI2CBus *bus = opaque;
1094
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
1095
bool handle_rx;
1096
1097
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
1098
1099
switch (offset) {
1100
case A_I2CD_FUN_CTRL:
1101
- if (FIELD_EX32(value, I2CD_FUN_CTRL, SLAVE_EN)) {
1102
+ if (SHARED_FIELD_EX32(value, SLAVE_EN)) {
1103
qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
1104
__func__);
1105
break;
1106
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
1107
bus->regs[R_I2CD_INTR_CTRL] = value & 0x7FFF;
1108
break;
1109
case A_I2CD_INTR_STS:
1110
- handle_rx = ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, RX_DONE) &&
1111
- FIELD_EX32(value, I2CD_INTR_STS, RX_DONE);
1112
+ handle_rx = SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CD_INTR_STS, RX_DONE)
1113
+ && SHARED_FIELD_EX32(value, RX_DONE);
1114
bus->regs[R_I2CD_INTR_STS] &= ~(value & 0x7FFF);
1115
if (!bus->regs[R_I2CD_INTR_STS]) {
1116
bus->controller->intr_status &= ~(1 << bus->id);
1117
qemu_irq_lower(aic->bus_get_irq(bus));
1118
}
1119
- if (handle_rx && (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_RX_CMD) ||
1120
- ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST))) {
1121
+ if (handle_rx && (SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CD_CMD,
1122
+ M_RX_CMD) ||
1123
+ SHARED_ARRAY_FIELD_EX32(bus->regs, R_I2CD_CMD,
1124
+ M_S_RX_CMD_LAST))) {
1125
aspeed_i2c_handle_rx_cmd(bus);
1126
aspeed_i2c_bus_raise_interrupt(bus);
1127
}
1128
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
1129
break;
1130
1131
case A_I2CD_BYTE_BUF:
1132
- ARRAY_FIELD_DP32(bus->regs, I2CD_BYTE_BUF, TX_BUF, value);
1133
+ SHARED_ARRAY_FIELD_DP32(bus->regs, R_I2CD_BYTE_BUF, TX_BUF, value);
1134
break;
1135
case A_I2CD_CMD:
1136
if (!aspeed_i2c_bus_is_enabled(bus)) {
1137
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
1138
}
1139
1140
if (!aic->has_dma &&
1141
- (FIELD_EX32(value, I2CD_CMD, RX_DMA_EN) ||
1142
- FIELD_EX32(value, I2CD_CMD, TX_DMA_EN))) {
1143
+ (SHARED_FIELD_EX32(value, RX_DMA_EN) ||
1144
+ SHARED_FIELD_EX32(value, TX_DMA_EN))) {
1145
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
1146
break;
1147
}
1148
1149
+ bus->regs[R_I2CD_CMD] &= ~0xFFFF;
1150
+ bus->regs[R_I2CD_CMD] |= value & 0xFFFF;
1151
+
1152
aspeed_i2c_bus_handle_cmd(bus, value);
1153
aspeed_i2c_bus_raise_interrupt(bus);
1154
break;
1155
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
1156
}
1157
}
1158
1159
+static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
1160
+ uint64_t value, unsigned size)
1161
+{
1162
+ AspeedI2CBus *bus = opaque;
1163
+ if (aspeed_i2c_is_new_mode(bus->controller)) {
1164
+ aspeed_i2c_bus_new_write(bus, offset, value, size);
1165
+ } else {
1166
+ aspeed_i2c_bus_old_write(bus, offset, value, size);
1167
+ }
1168
+}
1169
+
1170
static uint64_t aspeed_i2c_ctrl_read(void *opaque, hwaddr offset,
1171
unsigned size)
1172
{
1173
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_ctrl_read(void *opaque, hwaddr offset,
1174
return s->intr_status;
1175
case A_I2C_CTRL_GLOBAL:
1176
return s->ctrl_global;
1177
+ case A_I2C_CTRL_NEW_CLK_DIVIDER:
1178
+ if (aspeed_i2c_is_new_mode(s)) {
1179
+ return s->new_clk_divider;
1180
+ }
1181
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
1182
+ __func__, offset);
1183
+ break;
1184
default:
1185
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
1186
__func__, offset);
1187
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_ctrl_write(void *opaque, hwaddr offset,
1188
case A_I2C_CTRL_GLOBAL:
1189
s->ctrl_global = value;
1190
break;
1191
+ case A_I2C_CTRL_NEW_CLK_DIVIDER:
1192
+ if (aspeed_i2c_is_new_mode(s)) {
1193
+ s->new_clk_divider = value;
1194
+ } else {
1195
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx
1196
+ "\n", __func__, offset);
1197
+ }
1198
+ break;
1199
case A_I2C_CTRL_STATUS:
1200
default:
1201
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
1202
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_i2c_pool_ops = {
1203
1204
static const VMStateDescription aspeed_i2c_bus_vmstate = {
1205
.name = TYPE_ASPEED_I2C,
1206
- .version_id = 4,
1207
- .minimum_version_id = 4,
1208
+ .version_id = 5,
1209
+ .minimum_version_id = 5,
1210
.fields = (VMStateField[]) {
1211
- VMSTATE_UINT32_ARRAY(regs, AspeedI2CBus, ASPEED_I2C_OLD_NUM_REG),
1212
+ VMSTATE_UINT32_ARRAY(regs, AspeedI2CBus, ASPEED_I2C_NEW_NUM_REG),
1213
VMSTATE_END_OF_LIST()
1214
}
1215
};
1216
--
927
--
1217
2.35.3
928
2.47.1
1218
929
1219
930
diff view generated by jsdifflib
New patch
1
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
3
Currently, these test cases only support to test CE0. To test all CE pins,
4
introduces new ce and node members in TestData structure. The ce member is used
5
for saving the ce index and node member is used for saving the node path,
6
respectively.
7
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Reviewed-by: Cédric Le Goater <clg@redhat.com>
10
Link: https://lore.kernel.org/r/20241127091543.1243114-4-jamin_lin@aspeedtech.com
11
Signed-off-by: Cédric Le Goater <clg@redhat.com>
12
---
13
tests/qtest/aspeed_smc-test.c | 77 ++++++++++++++++++-----------------
14
1 file changed, 40 insertions(+), 37 deletions(-)
15
16
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
17
index XXXXXXX..XXXXXXX 100644
18
--- a/tests/qtest/aspeed_smc-test.c
19
+++ b/tests/qtest/aspeed_smc-test.c
20
@@ -XXX,XX +XXX,XX @@
21
* ASPEED SPI Controller registers
22
*/
23
#define R_CONF 0x00
24
-#define CONF_ENABLE_W0 (1 << 16)
25
+#define CONF_ENABLE_W0 16
26
#define R_CE_CTRL 0x04
27
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
28
#define R_CTRL0 0x10
29
-#define CTRL_CE_STOP_ACTIVE (1 << 2)
30
+#define CTRL_CE_STOP_ACTIVE BIT(2)
31
#define CTRL_READMODE 0x0
32
#define CTRL_FREADMODE 0x1
33
#define CTRL_WRITEMODE 0x2
34
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
35
uint64_t flash_base;
36
uint32_t jedec_id;
37
char *tmp_path;
38
+ uint8_t cs;
39
+ const char *node;
40
} TestData;
41
42
/*
43
@@ -XXX,XX +XXX,XX @@ static void spi_ce_ctrl(const TestData *data, uint32_t value)
44
45
static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
46
{
47
- uint32_t ctrl = spi_readl(data, R_CTRL0);
48
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
49
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
50
ctrl &= ~(CTRL_USERMODE | 0xff << 16);
51
ctrl |= mode | (cmd << 16);
52
- spi_writel(data, R_CTRL0, ctrl);
53
+ spi_writel(data, ctrl_reg, ctrl);
54
}
55
56
static void spi_ctrl_start_user(const TestData *data)
57
{
58
- uint32_t ctrl = spi_readl(data, R_CTRL0);
59
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
60
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
61
62
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
63
- spi_writel(data, R_CTRL0, ctrl);
64
+ spi_writel(data, ctrl_reg, ctrl);
65
66
ctrl &= ~CTRL_CE_STOP_ACTIVE;
67
- spi_writel(data, R_CTRL0, ctrl);
68
+ spi_writel(data, ctrl_reg, ctrl);
69
}
70
71
static void spi_ctrl_stop_user(const TestData *data)
72
{
73
- uint32_t ctrl = spi_readl(data, R_CTRL0);
74
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
75
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
76
77
ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
78
- spi_writel(data, R_CTRL0, ctrl);
79
+ spi_writel(data, ctrl_reg, ctrl);
80
}
81
82
static void flash_reset(const TestData *data)
83
{
84
- spi_conf(data, CONF_ENABLE_W0);
85
+ spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
86
87
spi_ctrl_start_user(data);
88
flash_writeb(data, 0, RESET_ENABLE);
89
@@ -XXX,XX +XXX,XX @@ static void flash_reset(const TestData *data)
90
flash_writeb(data, 0, WRDI);
91
spi_ctrl_stop_user(data);
92
93
- spi_conf_remove(data, CONF_ENABLE_W0);
94
+ spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
95
}
96
97
static void test_read_jedec(const void *data)
98
@@ -XXX,XX +XXX,XX @@ static void test_read_jedec(const void *data)
99
const TestData *test_data = (const TestData *)data;
100
uint32_t jedec = 0x0;
101
102
- spi_conf(test_data, CONF_ENABLE_W0);
103
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
104
105
spi_ctrl_start_user(test_data);
106
flash_writeb(test_data, 0, JEDEC_READ);
107
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
108
uint32_t page[FLASH_PAGE_SIZE / 4];
109
int i;
110
111
- spi_conf(test_data, CONF_ENABLE_W0);
112
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
113
114
/*
115
* Previous page should be full of 0xffs after backend is
116
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
117
uint32_t page[FLASH_PAGE_SIZE / 4];
118
int i;
119
120
- spi_conf(test_data, CONF_ENABLE_W0);
121
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
122
123
/*
124
* Previous page should be full of 0xffs after backend is
125
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
126
uint32_t page[FLASH_PAGE_SIZE / 4];
127
int i;
128
129
- spi_conf(test_data, CONF_ENABLE_W0);
130
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
131
132
spi_ctrl_start_user(test_data);
133
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
134
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
135
int i;
136
137
/*
138
- * Enable 4BYTE mode for controller. This is should be strapped by
139
- * HW for CE0 anyhow.
140
+ * Enable 4BYTE mode for controller.
141
*/
142
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
143
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
144
145
/* Enable 4BYTE mode for flash. */
146
- spi_conf(test_data, CONF_ENABLE_W0);
147
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
148
spi_ctrl_start_user(test_data);
149
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
150
flash_writeb(test_data, 0, WREN);
151
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
152
flash_writel(test_data, 0, make_be32(my_page_addr + i * 4));
153
}
154
spi_ctrl_stop_user(test_data);
155
- spi_conf_remove(test_data, CONF_ENABLE_W0);
156
+ spi_conf_remove(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
157
158
/* Check what was written */
159
read_page_mem(test_data, my_page_addr, page);
160
@@ -XXX,XX +XXX,XX @@ static void test_write_page_mem(const void *data)
161
int i;
162
163
/*
164
- * Enable 4BYTE mode for controller. This is should be strapped by
165
- * HW for CE0 anyhow.
166
+ * Enable 4BYTE mode for controller.
167
*/
168
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
169
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
170
171
/* Enable 4BYTE mode for flash. */
172
- spi_conf(test_data, CONF_ENABLE_W0);
173
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
174
spi_ctrl_start_user(test_data);
175
flash_writeb(test_data, 0, EN_4BYTE_ADDR);
176
flash_writeb(test_data, 0, WREN);
177
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
178
const TestData *test_data = (const TestData *)data;
179
uint8_t r;
180
181
- spi_conf(test_data, CONF_ENABLE_W0);
182
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
183
184
spi_ctrl_start_user(test_data);
185
flash_writeb(test_data, 0, RDSR);
186
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
187
188
g_assert_cmphex(r & SR_WEL, ==, 0);
189
g_assert(!qtest_qom_get_bool
190
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
191
+ (test_data->s, test_data->node, "write-enable"));
192
193
spi_ctrl_start_user(test_data);
194
flash_writeb(test_data, 0, WREN);
195
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
196
197
g_assert_cmphex(r & SR_WEL, ==, SR_WEL);
198
g_assert(qtest_qom_get_bool
199
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
200
+ (test_data->s, test_data->node, "write-enable"));
201
202
spi_ctrl_start_user(test_data);
203
flash_writeb(test_data, 0, WRDI);
204
@@ -XXX,XX +XXX,XX @@ static void test_read_status_reg(const void *data)
205
206
g_assert_cmphex(r & SR_WEL, ==, 0);
207
g_assert(!qtest_qom_get_bool
208
- (test_data->s, "/machine/soc/fmc/ssi.0/child[0]", "write-enable"));
209
+ (test_data->s, test_data->node, "write-enable"));
210
211
flash_reset(test_data);
212
}
213
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
214
const TestData *test_data = (const TestData *)data;
215
uint8_t r;
216
217
- spi_conf(test_data, CONF_ENABLE_W0);
218
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
219
220
/* default case: WP# is high and SRWD is low -> status register writable */
221
spi_ctrl_start_user(test_data);
222
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
223
g_assert_cmphex(r & SRWD, ==, 0);
224
225
/* WP# low and SRWD low -> status register writable */
226
- qtest_set_irq_in(test_data->s,
227
- "/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 0);
228
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 0);
229
spi_ctrl_start_user(test_data);
230
flash_writeb(test_data, 0, WREN);
231
/* test ability to write SRWD */
232
@@ -XXX,XX +XXX,XX @@ static void test_status_reg_write_protection(const void *data)
233
/* write is not successful */
234
g_assert_cmphex(r & SRWD, ==, SRWD);
235
236
- qtest_set_irq_in(test_data->s,
237
- "/machine/soc/fmc/ssi.0/child[0]", "WP#", 0, 1);
238
+ qtest_set_irq_in(test_data->s, test_data->node, "WP#", 0, 1);
239
flash_reset(test_data);
240
}
241
242
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect(const void *data)
243
uint32_t sector_size = 65536;
244
uint32_t n_sectors = 512;
245
246
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
247
- spi_conf(test_data, CONF_ENABLE_W0);
248
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
249
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
250
251
uint32_t bp_bits = 0b0;
252
253
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
254
uint32_t sector_size = 65536;
255
uint32_t n_sectors = 512;
256
257
- spi_ce_ctrl(test_data, 1 << CRTL_EXTENDED0);
258
- spi_conf(test_data, CONF_ENABLE_W0);
259
+ spi_ce_ctrl(test_data, 1 << (CRTL_EXTENDED0 + test_data->cs));
260
+ spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
261
262
/* top bottom bit is enabled */
263
uint32_t bp_bits = 0b00100 << 3;
264
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
265
data->flash_base = 0x20000000;
266
data->spi_base = 0x1E620000;
267
data->jedec_id = 0x20ba19;
268
+ data->cs = 0;
269
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
270
271
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
272
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
273
--
274
2.47.1
275
276
diff view generated by jsdifflib
1
From: Joe Komlodi <komlodi@google.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Signed-off-by: Joe Komlodi <komlodi@google.com>
3
Currently, these test cases used the hardcode offset 0x1400000 (0x14000 * 256)
4
Change-Id: I566eb09f4b9016e24570572f367627f6594039f5
4
which was beyond the 16MB flash size for flash page read/write command testing.
5
Message-Id: <20220331043248.2237838-7-komlodi@google.com>
5
However, the default fmc flash model of ast1030-a1 EVB is "w25q80bl" whose size
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
is 1MB. To test SoC flash models, introduces a new page_addr member in TestData
7
structure, so users can set the offset for flash page read/write command
8
testing.
9
10
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@redhat.com>
12
Link: https://lore.kernel.org/r/20241127091543.1243114-5-jamin_lin@aspeedtech.com
13
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
14
---
8
hw/i2c/aspeed_i2c.c | 3 +++
15
tests/qtest/aspeed_smc-test.c | 17 ++++++++++-------
9
hw/i2c/trace-events | 2 +-
16
1 file changed, 10 insertions(+), 7 deletions(-)
10
2 files changed, 4 insertions(+), 1 deletion(-)
11
17
12
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.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/hw/i2c/aspeed_i2c.c
20
--- a/tests/qtest/aspeed_smc-test.c
15
+++ b/hw/i2c/aspeed_i2c.c
21
+++ b/tests/qtest/aspeed_smc-test.c
16
@@ -XXX,XX +XXX,XX @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
22
@@ -XXX,XX +XXX,XX @@ typedef struct TestData {
17
bool raise_irq;
23
char *tmp_path;
18
24
uint8_t cs;
19
trace_aspeed_i2c_bus_raise_interrupt(bus->regs[reg_intr_sts],
25
const char *node;
20
+ aspeed_i2c_bus_pkt_mode_en(bus) &&
26
+ uint32_t page_addr;
21
+ ARRAY_FIELD_EX32(bus->regs, I2CM_INTR_STS, PKT_CMD_DONE) ?
27
} TestData;
22
+ "pktdone|" : "",
28
23
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_NAK) ? "nak|" : "",
29
/*
24
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, TX_ACK) ? "ack|" : "",
30
@@ -XXX,XX +XXX,XX @@ static void assert_page_mem(const TestData *data, uint32_t addr,
25
SHARED_ARRAY_FIELD_EX32(bus->regs, reg_intr_sts, RX_DONE) ? "done|"
31
static void test_erase_sector(const void *data)
26
diff --git a/hw/i2c/trace-events b/hw/i2c/trace-events
32
{
27
index XXXXXXX..XXXXXXX 100644
33
const TestData *test_data = (const TestData *)data;
28
--- a/hw/i2c/trace-events
34
- uint32_t some_page_addr = 0x600 * FLASH_PAGE_SIZE;
29
+++ b/hw/i2c/trace-events
35
+ uint32_t some_page_addr = test_data->page_addr;
30
@@ -XXX,XX +XXX,XX @@ i2c_recv(uint8_t address, uint8_t data) "recv(addr:0x%02x) data:0x%02x"
36
uint32_t page[FLASH_PAGE_SIZE / 4];
31
# aspeed_i2c.c
37
int i;
32
38
33
aspeed_i2c_bus_cmd(uint32_t cmd, const char *cmd_flags, uint32_t count, uint32_t intr_status) "handling cmd=0x%x %s count=%d intr=0x%x"
39
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(const void *data)
34
-aspeed_i2c_bus_raise_interrupt(uint32_t intr_status, const char *str1, const char *str2, const char *str3, const char *str4, const char *str5) "handled intr=0x%x %s%s%s%s%s"
40
static void test_erase_all(const void *data)
35
+aspeed_i2c_bus_raise_interrupt(uint32_t intr_status, const char *str1, const char *str2, const char *str3, const char *str4, const char *str5, const char *str6) "handled intr=0x%x %s%s%s%s%s%s"
41
{
36
aspeed_i2c_bus_read(uint32_t busid, uint64_t offset, unsigned size, uint64_t value) "bus[%d]: To 0x%" PRIx64 " of size %u: 0x%" PRIx64
42
const TestData *test_data = (const TestData *)data;
37
aspeed_i2c_bus_write(uint32_t busid, uint64_t offset, unsigned size, uint64_t value) "bus[%d]: To 0x%" PRIx64 " of size %u: 0x%" PRIx64
43
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
38
aspeed_i2c_bus_send(const char *mode, int i, int count, uint8_t byte) "%s send %d/%d 0x%02x"
44
+ uint32_t some_page_addr = test_data->page_addr;
45
uint32_t page[FLASH_PAGE_SIZE / 4];
46
int i;
47
48
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(const void *data)
49
static void test_write_page(const void *data)
50
{
51
const TestData *test_data = (const TestData *)data;
52
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
53
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
54
+ uint32_t my_page_addr = test_data->page_addr;
55
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
56
uint32_t page[FLASH_PAGE_SIZE / 4];
57
int i;
58
59
@@ -XXX,XX +XXX,XX @@ static void test_write_page(const void *data)
60
static void test_read_page_mem(const void *data)
61
{
62
const TestData *test_data = (const TestData *)data;
63
- uint32_t my_page_addr = 0x14000 * FLASH_PAGE_SIZE; /* beyond 16MB */
64
- uint32_t some_page_addr = 0x15000 * FLASH_PAGE_SIZE;
65
+ uint32_t my_page_addr = test_data->page_addr;
66
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
67
uint32_t page[FLASH_PAGE_SIZE / 4];
68
int i;
69
70
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(const void *data)
71
static void test_write_page_mem(const void *data)
72
{
73
const TestData *test_data = (const TestData *)data;
74
- uint32_t my_page_addr = 0x15000 * FLASH_PAGE_SIZE;
75
+ uint32_t my_page_addr = test_data->page_addr;
76
uint32_t page[FLASH_PAGE_SIZE / 4];
77
int i;
78
79
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
80
data->jedec_id = 0x20ba19;
81
data->cs = 0;
82
data->node = "/machine/soc/fmc/ssi.0/child[0]";
83
+ /* beyond 16MB */
84
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
85
86
qtest_add_data_func("/ast2400/smc/read_jedec", data, test_read_jedec);
87
qtest_add_data_func("/ast2400/smc/erase_sector", data, test_erase_sector);
39
--
88
--
40
2.35.3
89
2.47.1
41
90
42
91
diff view generated by jsdifflib
1
Add an RTC device and check that the output of the hwclock command
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
matches the current year.
3
2
4
Signed-off-by: Cédric Le Goater <clg@kaod.org>
3
Add test_ast2500_evb function and reused testcases for AST2500 testing.
5
Reviewed-by: Joel Stanley <joel@jms.id.au>
4
The spi base address, flash base address and ce index of fmc_cs0 are
6
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
0x1E620000, 0x20000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "mx25l25635e" whose size is 32MB,
7
so set jedec_id 0xc22019.
8
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-6-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
7
---
13
---
8
tests/avocado/machine_aspeed.py | 8 ++++++++
14
tests/qtest/aspeed_smc-test.c | 40 +++++++++++++++++++++++++++++++++++
9
1 file changed, 8 insertions(+)
15
1 file changed, 40 insertions(+)
10
16
11
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
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/tests/avocado/machine_aspeed.py
19
--- a/tests/qtest/aspeed_smc-test.c
14
+++ b/tests/avocado/machine_aspeed.py
20
+++ b/tests/qtest/aspeed_smc-test.c
15
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_builroot(self):
21
@@ -XXX,XX +XXX,XX @@ static void test_palmetto_bmc(TestData *data)
16
22
data, test_write_block_protect_bottom_bit);
17
self.vm.add_args('-device',
23
}
18
'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
24
19
+ self.vm.add_args('-device',
25
+static void test_ast2500_evb(TestData *data)
20
+ 'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
26
+{
21
self.do_test_arm_aspeed_buidroot_start(image_path, '0xf00')
27
+ int ret;
22
28
+ int fd;
23
exec_command_and_wait_for_pattern(self,
24
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_builroot(self):
25
exec_command_and_wait_for_pattern(self,
26
'cat /sys/class/hwmon/hwmon0/temp1_input', '18000')
27
28
+ exec_command_and_wait_for_pattern(self,
29
+ 'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
30
+ 'i2c i2c-3: new_device: Instantiated device ds1307 at 0x32');
31
+ year = time.strftime("%Y")
32
+ exec_command_and_wait_for_pattern(self, 'hwclock -f /dev/rtc1', year);
33
+
29
+
34
self.do_test_arm_aspeed_buidroot_poweroff()
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)
62
{
63
TestData palmetto_data;
64
+ TestData ast2500_evb_data;
65
int ret;
66
67
g_test_init(&argc, &argv, NULL);
68
69
test_palmetto_bmc(&palmetto_data);
70
+ test_ast2500_evb(&ast2500_evb_data);
71
ret = g_test_run();
72
73
qtest_quit(palmetto_data.s);
74
+ qtest_quit(ast2500_evb_data.s);
75
unlink(palmetto_data.tmp_path);
76
+ unlink(ast2500_evb_data.tmp_path);
77
return ret;
78
}
35
--
79
--
36
2.35.3
80
2.47.1
37
81
38
82
diff view generated by jsdifflib
1
From: Iris Chen <irischenlj@fb.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Signed-off-by: Iris Chen <irischenlj@fb.com>
3
Add test_ast2600_evb function and reused testcases for AST2600 testing.
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
4
The spi base address, flash base address and ce index of fmc_cs0 are
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
0x1E620000, 0x20000000 and 0, respectively.
6
The default flash model of fmc_cs0 is "mx66u51235f" whose size is 64MB,
7
so set jedec_id 0xc2253a.
8
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-7-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
13
---
7
tests/qtest/aspeed_smc-test.c | 74 +++++++++++++++++++++++++++++------
14
tests/qtest/aspeed_smc-test.c | 41 +++++++++++++++++++++++++++++++++++
8
1 file changed, 63 insertions(+), 11 deletions(-)
15
1 file changed, 41 insertions(+)
9
16
10
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/tests/qtest/aspeed_smc-test.c
19
--- a/tests/qtest/aspeed_smc-test.c
13
+++ b/tests/qtest/aspeed_smc-test.c
20
+++ b/tests/qtest/aspeed_smc-test.c
14
@@ -XXX,XX +XXX,XX @@ static void flash_reset(void)
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
15
spi_ctrl_start_user();
22
qtest_add_data_func("/ast2500/smc/read_status_reg",
16
writeb(ASPEED_FLASH_BASE, RESET_ENABLE);
23
data, test_read_status_reg);
17
writeb(ASPEED_FLASH_BASE, RESET_MEMORY);
24
}
18
+ writeb(ASPEED_FLASH_BASE, WREN);
19
+ writeb(ASPEED_FLASH_BASE, BULK_ERASE);
20
+ writeb(ASPEED_FLASH_BASE, WRDI);
21
spi_ctrl_stop_user();
22
23
spi_conf_remove(CONF_ENABLE_W0);
24
@@ -XXX,XX +XXX,XX @@ static void test_erase_sector(void)
25
26
spi_conf(CONF_ENABLE_W0);
27
28
+ /*
29
+ * Previous page should be full of 0xffs after backend is
30
+ * initialized
31
+ */
32
+ read_page(some_page_addr - FLASH_PAGE_SIZE, page);
33
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
34
+ g_assert_cmphex(page[i], ==, 0xffffffff);
35
+ }
36
+
25
+
37
spi_ctrl_start_user();
26
+static void test_ast2600_evb(TestData *data)
38
- writeb(ASPEED_FLASH_BASE, WREN);
27
+{
39
writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
28
+ int ret;
40
- writeb(ASPEED_FLASH_BASE, ERASE_SECTOR);
29
+ int fd;
41
+ writeb(ASPEED_FLASH_BASE, WREN);
42
+ writeb(ASPEED_FLASH_BASE, PP);
43
writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
44
+
30
+
45
+ /* Fill the page with its own addresses */
31
+ fd = g_file_open_tmp("qtest.m25p80.mx66u51235f.XXXXXX",
46
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
32
+ &data->tmp_path, NULL);
47
+ writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
33
+ g_assert(fd >= 0);
48
+ }
34
+ ret = ftruncate(fd, 64 * 1024 * 1024);
49
spi_ctrl_stop_user();
35
+ g_assert(ret == 0);
50
36
+ close(fd);
51
- /* Previous page should be full of zeroes as backend is not
52
- * initialized */
53
- read_page(some_page_addr - FLASH_PAGE_SIZE, page);
54
+ /* Check the page is correctly written */
55
+ read_page(some_page_addr, page);
56
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
57
- g_assert_cmphex(page[i], ==, 0x0);
58
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
59
}
60
61
- /* But this one was erased */
62
+ spi_ctrl_start_user();
63
+ writeb(ASPEED_FLASH_BASE, WREN);
64
+ writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
65
+ writeb(ASPEED_FLASH_BASE, ERASE_SECTOR);
66
+ writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
67
+ spi_ctrl_stop_user();
68
+
37
+
69
+ /* Check the page is erased */
38
+ data->s = qtest_initf("-machine ast2600-evb "
70
read_page(some_page_addr, page);
39
+ "-drive file=%s,format=raw,if=mtd",
71
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
40
+ data->tmp_path);
72
g_assert_cmphex(page[i], ==, 0xffffffff);
73
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(void)
74
75
spi_conf(CONF_ENABLE_W0);
76
77
- /* Check some random page. Should be full of zeroes as backend is
78
- * not initialized */
79
+ /*
80
+ * Previous page should be full of 0xffs after backend is
81
+ * initialized
82
+ */
83
+ read_page(some_page_addr - FLASH_PAGE_SIZE, page);
84
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
85
+ g_assert_cmphex(page[i], ==, 0xffffffff);
86
+ }
87
+
41
+
88
+ spi_ctrl_start_user();
42
+ /* fmc cs0 with mx66u51235f flash */
89
+ writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
43
+ data->flash_base = 0x20000000;
90
+ writeb(ASPEED_FLASH_BASE, WREN);
44
+ data->spi_base = 0x1E620000;
91
+ writeb(ASPEED_FLASH_BASE, PP);
45
+ data->jedec_id = 0xc2253a;
92
+ writel(ASPEED_FLASH_BASE, make_be32(some_page_addr));
46
+ data->cs = 0;
47
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
48
+ /* beyond 16MB */
49
+ data->page_addr = 0x14000 * FLASH_PAGE_SIZE;
93
+
50
+
94
+ /* Fill the page with its own addresses */
51
+ qtest_add_data_func("/ast2600/smc/read_jedec", data, test_read_jedec);
95
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
52
+ qtest_add_data_func("/ast2600/smc/erase_sector", data, test_erase_sector);
96
+ writel(ASPEED_FLASH_BASE, make_be32(some_page_addr + i * 4));
53
+ qtest_add_data_func("/ast2600/smc/erase_all", data, test_erase_all);
97
+ }
54
+ qtest_add_data_func("/ast2600/smc/write_page", data, test_write_page);
98
+ spi_ctrl_stop_user();
55
+ qtest_add_data_func("/ast2600/smc/read_page_mem",
99
+
56
+ data, test_read_page_mem);
100
+ /* Check the page is correctly written */
57
+ qtest_add_data_func("/ast2600/smc/write_page_mem",
101
read_page(some_page_addr, page);
58
+ data, test_write_page_mem);
102
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
59
+ qtest_add_data_func("/ast2600/smc/read_status_reg",
103
- g_assert_cmphex(page[i], ==, 0x0);
60
+ data, test_read_status_reg);
104
+ g_assert_cmphex(page[i], ==, some_page_addr + i * 4);
61
+}
105
}
62
int main(int argc, char **argv)
106
63
{
107
spi_ctrl_start_user();
64
TestData palmetto_data;
108
@@ -XXX,XX +XXX,XX @@ static void test_erase_all(void)
65
TestData ast2500_evb_data;
109
writeb(ASPEED_FLASH_BASE, BULK_ERASE);
66
+ TestData ast2600_evb_data;
110
spi_ctrl_stop_user();
67
int ret;
111
68
112
- /* Recheck that some random page */
69
g_test_init(&argc, &argv, NULL);
113
+ /* Check the page is erased */
70
114
read_page(some_page_addr, page);
71
test_palmetto_bmc(&palmetto_data);
115
for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
72
test_ast2500_evb(&ast2500_evb_data);
116
g_assert_cmphex(page[i], ==, 0xffffffff);
73
+ test_ast2600_evb(&ast2600_evb_data);
117
@@ -XXX,XX +XXX,XX @@ static void test_read_page_mem(void)
118
spi_conf(CONF_ENABLE_W0);
119
spi_ctrl_start_user();
120
writeb(ASPEED_FLASH_BASE, EN_4BYTE_ADDR);
121
+ writeb(ASPEED_FLASH_BASE, WREN);
122
+ writeb(ASPEED_FLASH_BASE, PP);
123
+ writel(ASPEED_FLASH_BASE, make_be32(my_page_addr));
124
+
125
+ /* Fill the page with its own addresses */
126
+ for (i = 0; i < FLASH_PAGE_SIZE / 4; i++) {
127
+ writel(ASPEED_FLASH_BASE, make_be32(my_page_addr + i * 4));
128
+ }
129
spi_ctrl_stop_user();
130
spi_conf_remove(CONF_ENABLE_W0);
131
132
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
133
qtest_add_func("/ast2400/smc/write_page_mem", test_write_page_mem);
134
qtest_add_func("/ast2400/smc/read_status_reg", test_read_status_reg);
135
136
+ flash_reset();
137
ret = g_test_run();
74
ret = g_test_run();
138
75
139
qtest_quit(global_qtest);
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
}
140
--
84
--
141
2.35.3
85
2.47.1
142
86
143
87
diff view generated by jsdifflib
1
Create a named I2C temperature sensor device on the command line,
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
instantiate device from Linux since it is not part of the device tree,
3
and check the temperature is correctly reported under sysfs.
4
2
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
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.
8
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
11
Link: https://lore.kernel.org/r/20241127091543.1243114-8-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
6
---
13
---
7
tests/avocado/machine_aspeed.py | 13 +++++++++++++
14
tests/qtest/aspeed_smc-test.c | 42 +++++++++++++++++++++++++++++++++++
8
1 file changed, 13 insertions(+)
15
1 file changed, 42 insertions(+)
9
16
10
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
17
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
11
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
12
--- a/tests/avocado/machine_aspeed.py
19
--- a/tests/qtest/aspeed_smc-test.c
13
+++ b/tests/avocado/machine_aspeed.py
20
+++ b/tests/qtest/aspeed_smc-test.c
14
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_builroot(self):
21
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
15
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
22
qtest_add_data_func("/ast2600/smc/read_status_reg",
16
algorithm='sha256')
23
data, test_read_status_reg);
17
24
}
18
+ self.vm.add_args('-device',
19
+ 'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
20
self.do_test_arm_aspeed_buidroot_start(image_path, '0xf00')
21
+
25
+
22
+ exec_command_and_wait_for_pattern(self,
26
+static void test_ast1030_evb(TestData *data)
23
+ 'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
27
+{
24
+ 'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
28
+ int ret;
25
+ exec_command_and_wait_for_pattern(self,
29
+ int fd;
26
+ 'cat /sys/class/hwmon/hwmon0/temp1_input', '0')
27
+ self.vm.command('qom-set', path='/machine/peripheral/tmp-test',
28
+ property='temperature', value=18000);
29
+ exec_command_and_wait_for_pattern(self,
30
+ 'cat /sys/class/hwmon/hwmon0/temp1_input', '18000')
31
+
30
+
32
self.do_test_arm_aspeed_buidroot_poweroff()
31
+ fd = g_file_open_tmp("qtest.m25p80.w25q80bl.XXXXXX",
32
+ &data->tmp_path, NULL);
33
+ g_assert(fd >= 0);
34
+ ret = ftruncate(fd, 1 * 1024 * 1024);
35
+ g_assert(ret == 0);
36
+ close(fd);
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
}
33
--
89
--
34
2.35.3
90
2.47.1
35
91
36
92
diff view generated by jsdifflib
1
From: Joe Komlodi <komlodi@google.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Using a register array will allow us to represent old-mode and new-mode
3
Add a new testcase for write page command with QPI mode testing.
4
I2C registers by using the same underlying register array, instead of
4
Currently, only run this testcase for AST2500, AST2600 and AST1030.
5
adding an entire new set of variables to represent new mode.
6
5
7
As part of this, we also do additional cleanup to use ARRAY_FIELD_
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
macros instead of FIELD_ macros on registers.
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>
10
---
11
tests/qtest/aspeed_smc-test.c | 74 +++++++++++++++++++++++++++++++++++
12
1 file changed, 74 insertions(+)
9
13
10
Signed-off-by: Joe Komlodi <komlodi@google.com>
14
diff --git a/tests/qtest/aspeed_smc-test.c b/tests/qtest/aspeed_smc-test.c
11
Change-Id: Ib94996b17c361b8490c042b43c99d8abc69332e3
12
[ clg: use of memset in aspeed_i2c_bus_reset() ]
13
Message-Id: <20220331043248.2237838-5-komlodi@google.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
16
include/hw/i2c/aspeed_i2c.h | 11 +-
17
hw/i2c/aspeed_i2c.c | 281 ++++++++++++++++--------------------
18
2 files changed, 128 insertions(+), 164 deletions(-)
19
20
diff --git a/include/hw/i2c/aspeed_i2c.h b/include/hw/i2c/aspeed_i2c.h
21
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
22
--- a/include/hw/i2c/aspeed_i2c.h
16
--- a/tests/qtest/aspeed_smc-test.c
23
+++ b/include/hw/i2c/aspeed_i2c.h
17
+++ b/tests/qtest/aspeed_smc-test.c
24
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedI2CState, AspeedI2CClass, ASPEED_I2C)
18
@@ -XXX,XX +XXX,XX @@
25
19
#define R_CE_CTRL 0x04
26
#define ASPEED_I2C_NR_BUSSES 16
20
#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
27
#define ASPEED_I2C_MAX_POOL_SIZE 0x800
21
#define R_CTRL0 0x10
28
+#define ASPEED_I2C_OLD_NUM_REG 11
22
+#define CTRL_IO_QUAD_IO BIT(31)
29
23
#define CTRL_CE_STOP_ACTIVE BIT(2)
30
struct AspeedI2CState;
24
#define CTRL_READMODE 0x0
31
25
#define CTRL_FREADMODE 0x1
32
@@ -XXX,XX +XXX,XX @@ struct AspeedI2CBus {
26
@@ -XXX,XX +XXX,XX @@ enum {
33
uint8_t id;
27
ERASE_SECTOR = 0xd8,
34
qemu_irq irq;
35
36
- uint32_t ctrl;
37
- uint32_t timing[2];
38
- uint32_t intr_ctrl;
39
- uint32_t intr_status;
40
- uint32_t cmd;
41
- uint32_t buf;
42
- uint32_t pool_ctrl;
43
- uint32_t dma_addr;
44
- uint32_t dma_len;
45
+ uint32_t regs[ASPEED_I2C_OLD_NUM_REG];
46
};
28
};
47
29
48
struct AspeedI2CState {
30
+#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
49
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
31
#define FLASH_PAGE_SIZE 256
50
index XXXXXXX..XXXXXXX 100644
32
51
--- a/hw/i2c/aspeed_i2c.c
33
typedef struct TestData {
52
+++ b/hw/i2c/aspeed_i2c.c
34
@@ -XXX,XX +XXX,XX @@ static void spi_ctrl_stop_user(const TestData *data)
53
@@ -XXX,XX +XXX,XX @@ REG32(I2CD_DMA_LEN, 0x28) /* DMA Transfer Length < 4KB */
35
spi_writel(data, ctrl_reg, ctrl);
54
36
}
55
static inline bool aspeed_i2c_bus_is_master(AspeedI2CBus *bus)
37
38
+static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
39
+{
40
+ uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
41
+ uint32_t ctrl = spi_readl(data, ctrl_reg);
42
+ uint32_t mode;
43
+
44
+ mode = value & CTRL_IO_MODE_MASK;
45
+ ctrl &= ~CTRL_IO_MODE_MASK;
46
+ ctrl |= mode;
47
+ spi_writel(data, ctrl_reg, ctrl);
48
+}
49
+
50
static void flash_reset(const TestData *data)
56
{
51
{
57
- return FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL, MASTER_EN);
52
spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
58
+ return ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, MASTER_EN);
53
@@ -XXX,XX +XXX,XX @@ static void test_write_block_protect_bottom_bit(const void *data)
54
flash_reset(test_data);
59
}
55
}
60
56
61
static inline bool aspeed_i2c_bus_is_enabled(AspeedI2CBus *bus)
57
+static void test_write_page_qpi(const void *data)
58
+{
59
+ const TestData *test_data = (const TestData *)data;
60
+ uint32_t my_page_addr = test_data->page_addr;
61
+ uint32_t some_page_addr = my_page_addr + FLASH_PAGE_SIZE;
62
+ uint32_t page[FLASH_PAGE_SIZE / 4];
63
+ uint32_t page_pattern[] = {
64
+ 0xebd8c134, 0x5da196bc, 0xae15e729, 0x5085ccdf
65
+ };
66
+ int i;
67
+
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)
62
{
112
{
63
- return FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL, MASTER_EN) ||
113
int ret;
64
- FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL, SLAVE_EN);
114
@@ -XXX,XX +XXX,XX @@ static void test_ast2500_evb(TestData *data)
65
+ return ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, MASTER_EN) ||
115
data, test_write_page_mem);
66
+ ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL, SLAVE_EN);
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);
67
}
120
}
68
121
69
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
122
static void test_ast2600_evb(TestData *data)
70
{
123
@@ -XXX,XX +XXX,XX @@ static void test_ast2600_evb(TestData *data)
71
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
124
data, test_write_page_mem);
72
125
qtest_add_data_func("/ast2600/smc/read_status_reg",
73
- trace_aspeed_i2c_bus_raise_interrupt(bus->intr_status,
126
data, test_read_status_reg);
74
- FIELD_EX32(bus->intr_status, I2CD_INTR_STS, TX_NAK) ? "nak|" : "",
127
+ qtest_add_data_func("/ast2600/smc/write_page_qpi",
75
- FIELD_EX32(bus->intr_status, I2CD_INTR_STS, TX_ACK) ? "ack|" : "",
128
+ data, test_write_page_qpi);
76
- FIELD_EX32(bus->intr_status, I2CD_INTR_STS, RX_DONE) ? "done|" : "",
77
- FIELD_EX32(bus->intr_status, I2CD_INTR_STS, NORMAL_STOP) ? "normal|"
78
- : "",
79
- FIELD_EX32(bus->intr_status, I2CD_INTR_STS, ABNORMAL) ? "abnormal"
80
- : "");
81
-
82
- bus->intr_status &= bus->intr_ctrl;
83
- if (bus->intr_status) {
84
+ trace_aspeed_i2c_bus_raise_interrupt(bus->regs[R_I2CD_INTR_STS],
85
+ ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, TX_NAK) ? "nak|" : "",
86
+ ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, TX_ACK) ? "ack|" : "",
87
+ ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, RX_DONE) ? "done|" : "",
88
+ ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, NORMAL_STOP) ? "normal|"
89
+ : "",
90
+ ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, ABNORMAL) ? "abnormal"
91
+ : "");
92
+
93
+ bus->regs[R_I2CD_INTR_STS] &= bus->regs[R_I2CD_INTR_CTRL];
94
+ if (bus->regs[R_I2CD_INTR_STS]) {
95
bus->controller->intr_status |= 1 << bus->id;
96
qemu_irq_raise(aic->bus_get_irq(bus));
97
}
98
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
99
{
100
AspeedI2CBus *bus = opaque;
101
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
102
- uint64_t value = -1;
103
+ uint64_t value = bus->regs[offset / sizeof(*bus->regs)];
104
105
switch (offset) {
106
case A_I2CD_FUN_CTRL:
107
- value = bus->ctrl;
108
- break;
109
case A_I2CD_AC_TIMING1:
110
- value = bus->timing[0];
111
- break;
112
case A_I2CD_AC_TIMING2:
113
- value = bus->timing[1];
114
- break;
115
case A_I2CD_INTR_CTRL:
116
- value = bus->intr_ctrl;
117
- break;
118
case A_I2CD_INTR_STS:
119
- value = bus->intr_status;
120
- break;
121
case A_I2CD_POOL_CTRL:
122
- value = bus->pool_ctrl;
123
- break;
124
case A_I2CD_BYTE_BUF:
125
- value = bus->buf;
126
+ /* Value is already set, don't do anything. */
127
break;
128
case A_I2CD_CMD:
129
- value = bus->cmd | (i2c_bus_busy(bus->bus) << 16);
130
+ value = FIELD_DP32(value, I2CD_CMD, BUS_BUSY_STS,
131
+ i2c_bus_busy(bus->bus));
132
break;
133
case A_I2CD_DMA_ADDR:
134
if (!aic->has_dma) {
135
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
136
- break;
137
+ value = -1;
138
}
139
- value = bus->dma_addr;
140
break;
141
case A_I2CD_DMA_LEN:
142
if (!aic->has_dma) {
143
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
144
- break;
145
+ value = -1;
146
}
147
- value = bus->dma_len;
148
break;
149
150
default:
151
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
152
153
static void aspeed_i2c_set_state(AspeedI2CBus *bus, uint8_t state)
154
{
155
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, TX_STATE, state);
156
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, TX_STATE, state);
157
}
129
}
158
130
159
static uint8_t aspeed_i2c_get_state(AspeedI2CBus *bus)
131
static void test_ast1030_evb(TestData *data)
160
{
132
@@ -XXX,XX +XXX,XX @@ static void test_ast1030_evb(TestData *data)
161
- return FIELD_EX32(bus->cmd, I2CD_CMD, TX_STATE);
133
data, test_write_page_mem);
162
+ return ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_STATE);
134
qtest_add_data_func("/ast1030/smc/read_status_reg",
135
data, test_read_status_reg);
136
+ qtest_add_data_func("/ast1030/smc/write_page_qpi",
137
+ data, test_write_page_qpi);
163
}
138
}
164
139
165
static int aspeed_i2c_dma_read(AspeedI2CBus *bus, uint8_t *data)
140
int main(int argc, char **argv)
166
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_dma_read(AspeedI2CBus *bus, uint8_t *data)
167
MemTxResult result;
168
AspeedI2CState *s = bus->controller;
169
170
- result = address_space_read(&s->dram_as, bus->dma_addr,
171
+ result = address_space_read(&s->dram_as, bus->regs[R_I2CD_DMA_ADDR],
172
MEMTXATTRS_UNSPECIFIED, data, 1);
173
if (result != MEMTX_OK) {
174
qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM read failed @%08x\n",
175
- __func__, bus->dma_addr);
176
+ __func__, bus->regs[R_I2CD_DMA_ADDR]);
177
return -1;
178
}
179
180
- bus->dma_addr++;
181
- bus->dma_len--;
182
+ bus->regs[R_I2CD_DMA_ADDR]++;
183
+ bus->regs[R_I2CD_DMA_LEN]--;
184
return 0;
185
}
186
187
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
188
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
189
int ret = -1;
190
int i;
191
- int pool_tx_count = FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, TX_COUNT);
192
+ int pool_tx_count = ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, TX_COUNT);
193
194
- if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN)) {
195
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN)) {
196
for (i = pool_start; i < pool_tx_count; i++) {
197
uint8_t *pool_base = aic->bus_pool_base(bus);
198
199
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
200
break;
201
}
202
}
203
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, TX_BUFF_EN, 0);
204
- } else if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN)) {
205
- while (bus->dma_len) {
206
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, TX_BUFF_EN, 0);
207
+ } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN)) {
208
+ while (bus->regs[R_I2CD_DMA_LEN]) {
209
uint8_t data;
210
aspeed_i2c_dma_read(bus, &data);
211
- trace_aspeed_i2c_bus_send("DMA", bus->dma_len, bus->dma_len, data);
212
+ trace_aspeed_i2c_bus_send("DMA", bus->regs[R_I2CD_DMA_LEN],
213
+ bus->regs[R_I2CD_DMA_LEN], data);
214
ret = i2c_send(bus->bus, data);
215
if (ret) {
216
break;
217
}
218
}
219
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, TX_DMA_EN, 0);
220
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, TX_DMA_EN, 0);
221
} else {
222
- trace_aspeed_i2c_bus_send("BYTE", pool_start, 1, bus->buf);
223
- ret = i2c_send(bus->bus, bus->buf);
224
+ trace_aspeed_i2c_bus_send("BYTE", pool_start, 1,
225
+ bus->regs[R_I2CD_BYTE_BUF]);
226
+ ret = i2c_send(bus->bus, bus->regs[R_I2CD_BYTE_BUF]);
227
}
228
229
return ret;
230
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
231
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
232
uint8_t data;
233
int i;
234
- int pool_rx_count = FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, RX_COUNT);
235
+ int pool_rx_count = ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, RX_COUNT);
236
237
- if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN)) {
238
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN)) {
239
uint8_t *pool_base = aic->bus_pool_base(bus);
240
241
for (i = 0; i < pool_rx_count; i++) {
242
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
243
}
244
245
/* Update RX count */
246
- bus->pool_ctrl = FIELD_DP32(bus->pool_ctrl, I2CD_POOL_CTRL, RX_COUNT,
247
- i & 0xff);
248
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, RX_BUFF_EN, 0);
249
- } else if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN)) {
250
+ ARRAY_FIELD_DP32(bus->regs, I2CD_POOL_CTRL, RX_COUNT, i & 0xff);
251
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, RX_BUFF_EN, 0);
252
+ } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN)) {
253
uint8_t data;
254
255
- while (bus->dma_len) {
256
+ while (bus->regs[R_I2CD_DMA_LEN]) {
257
MemTxResult result;
258
259
data = i2c_recv(bus->bus);
260
- trace_aspeed_i2c_bus_recv("DMA", bus->dma_len, bus->dma_len, data);
261
- result = address_space_write(&s->dram_as, bus->dma_addr,
262
+ trace_aspeed_i2c_bus_recv("DMA", bus->regs[R_I2CD_DMA_LEN],
263
+ bus->regs[R_I2CD_DMA_LEN], data);
264
+ result = address_space_write(&s->dram_as,
265
+ bus->regs[R_I2CD_DMA_ADDR],
266
MEMTXATTRS_UNSPECIFIED, &data, 1);
267
if (result != MEMTX_OK) {
268
qemu_log_mask(LOG_GUEST_ERROR, "%s: DRAM write failed @%08x\n",
269
- __func__, bus->dma_addr);
270
+ __func__, bus->regs[R_I2CD_DMA_ADDR]);
271
return;
272
}
273
- bus->dma_addr++;
274
- bus->dma_len--;
275
+ bus->regs[R_I2CD_DMA_ADDR]++;
276
+ bus->regs[R_I2CD_DMA_LEN]--;
277
}
278
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, RX_DMA_EN, 0);
279
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, RX_DMA_EN, 0);
280
} else {
281
data = i2c_recv(bus->bus);
282
- trace_aspeed_i2c_bus_recv("BYTE", 1, 1, bus->buf);
283
- bus->buf = FIELD_DP32(bus->buf, I2CD_BYTE_BUF, RX_BUF, data);
284
+ trace_aspeed_i2c_bus_recv("BYTE", 1, 1, bus->regs[R_I2CD_BYTE_BUF]);
285
+ ARRAY_FIELD_DP32(bus->regs, I2CD_BYTE_BUF, RX_BUF, data);
286
}
287
}
288
289
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_handle_rx_cmd(AspeedI2CBus *bus)
290
{
291
aspeed_i2c_set_state(bus, I2CD_MRXD);
292
aspeed_i2c_bus_recv(bus);
293
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS, RX_DONE, 1);
294
- if (FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST)) {
295
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, RX_DONE, 1);
296
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST)) {
297
i2c_nack(bus->bus);
298
}
299
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_RX_CMD, 0);
300
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST, 0);
301
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_RX_CMD, 0);
302
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST, 0);
303
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
304
}
305
306
@@ -XXX,XX +XXX,XX @@ static uint8_t aspeed_i2c_get_addr(AspeedI2CBus *bus)
307
{
308
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
309
310
- if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN)) {
311
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN)) {
312
uint8_t *pool_base = aic->bus_pool_base(bus);
313
314
return pool_base[0];
315
- } else if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN)) {
316
+ } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN)) {
317
uint8_t data;
318
319
aspeed_i2c_dma_read(bus, &data);
320
return data;
321
} else {
322
- return bus->buf;
323
+ return bus->regs[R_I2CD_BYTE_BUF];
324
}
325
}
326
327
@@ -XXX,XX +XXX,XX @@ static bool aspeed_i2c_check_sram(AspeedI2CBus *bus)
328
{
329
AspeedI2CState *s = bus->controller;
330
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
331
- bool dma_en = FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN) ||
332
- FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN) ||
333
- FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN) ||
334
- FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN);
335
+ bool dma_en = ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN) ||
336
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN) ||
337
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN) ||
338
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN);
339
if (!aic->check_sram) {
340
return true;
341
}
342
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
343
{
344
g_autofree char *cmd_flags = NULL;
345
uint32_t count;
346
- if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN)) {
347
- count = FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, TX_COUNT);
348
- } else if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN)) {
349
- count = bus->dma_len;
350
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN)) {
351
+ count = ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, TX_COUNT);
352
+ } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN)) {
353
+ count = bus->regs[R_I2CD_DMA_LEN];
354
} else { /* BYTE mode */
355
count = 1;
356
}
357
358
cmd_flags = g_strdup_printf("%s%s%s%s%s%s%s%s%s",
359
- FIELD_EX32(bus->cmd, I2CD_CMD, M_START_CMD) ? "start|" : "",
360
- FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN) ? "rxdma|" : "",
361
- FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN) ? "txdma|" : "",
362
- FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN) ? "rxbuf|" : "",
363
- FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN) ? "txbuf|" : "",
364
- FIELD_EX32(bus->cmd, I2CD_CMD, M_TX_CMD) ? "tx|" : "",
365
- FIELD_EX32(bus->cmd, I2CD_CMD, M_RX_CMD) ? "rx|" : "",
366
- FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST) ? "last|" : "",
367
- FIELD_EX32(bus->cmd, I2CD_CMD, M_STOP_CMD) ? "stop" : "");
368
-
369
- trace_aspeed_i2c_bus_cmd(bus->cmd, cmd_flags, count, bus->intr_status);
370
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_START_CMD) ? "start|" : "",
371
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_DMA_EN) ? "rxdma|" : "",
372
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN) ? "txdma|" : "",
373
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, RX_BUFF_EN) ? "rxbuf|" : "",
374
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN) ? "txbuf|" : "",
375
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_TX_CMD) ? "tx|" : "",
376
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_RX_CMD) ? "rx|" : "",
377
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST) ? "last|" : "",
378
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_STOP_CMD) ? "stop" : "");
379
+
380
+ trace_aspeed_i2c_bus_cmd(bus->regs[R_I2CD_CMD], cmd_flags, count,
381
+ bus->regs[R_I2CD_INTR_STS]);
382
}
383
384
/*
385
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
386
{
387
uint8_t pool_start = 0;
388
389
- bus->cmd &= ~0xFFFF;
390
- bus->cmd |= value & 0xFFFF;
391
+ bus->regs[R_I2CD_CMD] &= ~0xFFFF;
392
+ bus->regs[R_I2CD_CMD] |= value & 0xFFFF;
393
394
if (!aspeed_i2c_check_sram(bus)) {
395
return;
396
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
397
aspeed_i2c_bus_cmd_dump(bus);
398
}
399
400
- if (FIELD_EX32(bus->cmd, I2CD_CMD, M_START_CMD)) {
401
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_START_CMD)) {
402
uint8_t state = aspeed_i2c_get_state(bus) & I2CD_MACTIVE ?
403
I2CD_MSTARTR : I2CD_MSTART;
404
uint8_t addr;
405
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
406
407
if (i2c_start_transfer(bus->bus, extract32(addr, 1, 7),
408
extract32(addr, 0, 1))) {
409
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
410
- TX_NAK, 1);
411
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_NAK, 1);
412
} else {
413
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
414
- TX_ACK, 1);
415
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_ACK, 1);
416
}
417
418
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_START_CMD, 0);
419
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_START_CMD, 0);
420
421
/*
422
* The START command is also a TX command, as the slave
423
* address is sent on the bus. Drop the TX flag if nothing
424
* else needs to be sent in this sequence.
425
*/
426
- if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN)) {
427
- if (FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, TX_COUNT) == 1) {
428
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
429
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_BUFF_EN)) {
430
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, TX_COUNT) == 1) {
431
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
432
} else {
433
/*
434
* Increase the start index in the TX pool buffer to
435
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
436
*/
437
pool_start++;
438
}
439
- } else if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN)) {
440
- if (bus->dma_len == 0) {
441
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
442
+ } else if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, TX_DMA_EN)) {
443
+ if (bus->regs[R_I2CD_DMA_LEN] == 0) {
444
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
445
}
446
} else {
447
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
448
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
449
}
450
451
/* No slave found */
452
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
453
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
454
}
455
456
- if (FIELD_EX32(bus->cmd, I2CD_CMD, M_TX_CMD)) {
457
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_TX_CMD)) {
458
aspeed_i2c_set_state(bus, I2CD_MTXD);
459
if (aspeed_i2c_bus_send(bus, pool_start)) {
460
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
461
- TX_NAK, 1);
462
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_NAK, 1);
463
i2c_end_transfer(bus->bus);
464
} else {
465
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
466
- TX_ACK, 1);
467
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, TX_ACK, 1);
468
}
469
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
470
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_TX_CMD, 0);
471
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
472
}
473
474
- if ((FIELD_EX32(bus->cmd, I2CD_CMD, M_RX_CMD) ||
475
- FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST)) &&
476
- !FIELD_EX32(bus->intr_status, I2CD_INTR_STS, RX_DONE)) {
477
+ if ((ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_RX_CMD) ||
478
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST)) &&
479
+ !ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, RX_DONE)) {
480
aspeed_i2c_handle_rx_cmd(bus);
481
}
482
483
- if (FIELD_EX32(bus->cmd, I2CD_CMD, M_STOP_CMD)) {
484
+ if (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_STOP_CMD)) {
485
if (!(aspeed_i2c_get_state(bus) & I2CD_MACTIVE)) {
486
qemu_log_mask(LOG_GUEST_ERROR, "%s: abnormal stop\n", __func__);
487
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
488
- ABNORMAL, 1);
489
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, ABNORMAL, 1);
490
} else {
491
aspeed_i2c_set_state(bus, I2CD_MSTOP);
492
i2c_end_transfer(bus->bus);
493
- bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
494
- NORMAL_STOP, 1);
495
+ ARRAY_FIELD_DP32(bus->regs, I2CD_INTR_STS, NORMAL_STOP, 1);
496
}
497
- bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_STOP_CMD, 0);
498
+ ARRAY_FIELD_DP32(bus->regs, I2CD_CMD, M_STOP_CMD, 0);
499
aspeed_i2c_set_state(bus, I2CD_IDLE);
500
}
501
}
502
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
503
__func__);
504
break;
505
}
506
- bus->ctrl = value & 0x0071C3FF;
507
+ bus->regs[R_I2CD_FUN_CTRL] = value & 0x0071C3FF;
508
break;
509
case A_I2CD_AC_TIMING1:
510
- bus->timing[0] = value & 0xFFFFF0F;
511
+ bus->regs[R_I2CD_AC_TIMING1] = value & 0xFFFFF0F;
512
break;
513
case A_I2CD_AC_TIMING2:
514
- bus->timing[1] = value & 0x7;
515
+ bus->regs[R_I2CD_AC_TIMING2] = value & 0x7;
516
break;
517
case A_I2CD_INTR_CTRL:
518
- bus->intr_ctrl = value & 0x7FFF;
519
+ bus->regs[R_I2CD_INTR_CTRL] = value & 0x7FFF;
520
break;
521
case A_I2CD_INTR_STS:
522
- handle_rx = FIELD_EX32(bus->intr_status, I2CD_INTR_STS, RX_DONE) &&
523
+ handle_rx = ARRAY_FIELD_EX32(bus->regs, I2CD_INTR_STS, RX_DONE) &&
524
FIELD_EX32(value, I2CD_INTR_STS, RX_DONE);
525
- bus->intr_status &= ~(value & 0x7FFF);
526
- if (!bus->intr_status) {
527
+ bus->regs[R_I2CD_INTR_STS] &= ~(value & 0x7FFF);
528
+ if (!bus->regs[R_I2CD_INTR_STS]) {
529
bus->controller->intr_status &= ~(1 << bus->id);
530
qemu_irq_lower(aic->bus_get_irq(bus));
531
}
532
- if (handle_rx && (FIELD_EX32(bus->cmd, I2CD_CMD, M_RX_CMD) ||
533
- FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST))) {
534
+ if (handle_rx && (ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_RX_CMD) ||
535
+ ARRAY_FIELD_EX32(bus->regs, I2CD_CMD, M_S_RX_CMD_LAST))) {
536
aspeed_i2c_handle_rx_cmd(bus);
537
aspeed_i2c_bus_raise_interrupt(bus);
538
}
539
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
540
__func__);
541
break;
542
case A_I2CD_POOL_CTRL:
543
- bus->pool_ctrl &= ~0xffffff;
544
- bus->pool_ctrl |= (value & 0xffffff);
545
+ bus->regs[R_I2CD_POOL_CTRL] &= ~0xffffff;
546
+ bus->regs[R_I2CD_POOL_CTRL] |= (value & 0xffffff);
547
break;
548
549
case A_I2CD_BYTE_BUF:
550
- bus->buf = FIELD_DP32(bus->buf, I2CD_BYTE_BUF, TX_BUF, value);
551
+ ARRAY_FIELD_DP32(bus->regs, I2CD_BYTE_BUF, TX_BUF, value);
552
break;
553
case A_I2CD_CMD:
554
if (!aspeed_i2c_bus_is_enabled(bus)) {
555
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
556
break;
557
}
558
559
- bus->dma_addr = value & 0x3ffffffc;
560
+ bus->regs[R_I2CD_DMA_ADDR] = value & 0x3ffffffc;
561
break;
562
563
case A_I2CD_DMA_LEN:
564
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
565
break;
566
}
567
568
- bus->dma_len = value & 0xfff;
569
- if (!bus->dma_len) {
570
+ bus->regs[R_I2CD_DMA_LEN] = value & 0xfff;
571
+ if (!bus->regs[R_I2CD_DMA_LEN]) {
572
qemu_log_mask(LOG_UNIMP, "%s: invalid DMA length\n", __func__);
573
}
574
break;
575
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_i2c_pool_ops = {
576
577
static const VMStateDescription aspeed_i2c_bus_vmstate = {
578
.name = TYPE_ASPEED_I2C,
579
- .version_id = 3,
580
- .minimum_version_id = 3,
581
+ .version_id = 4,
582
+ .minimum_version_id = 4,
583
.fields = (VMStateField[]) {
584
- VMSTATE_UINT8(id, AspeedI2CBus),
585
- VMSTATE_UINT32(ctrl, AspeedI2CBus),
586
- VMSTATE_UINT32_ARRAY(timing, AspeedI2CBus, 2),
587
- VMSTATE_UINT32(intr_ctrl, AspeedI2CBus),
588
- VMSTATE_UINT32(intr_status, AspeedI2CBus),
589
- VMSTATE_UINT32(cmd, AspeedI2CBus),
590
- VMSTATE_UINT32(buf, AspeedI2CBus),
591
- VMSTATE_UINT32(pool_ctrl, AspeedI2CBus),
592
- VMSTATE_UINT32(dma_addr, AspeedI2CBus),
593
- VMSTATE_UINT32(dma_len, AspeedI2CBus),
594
+ VMSTATE_UINT32_ARRAY(regs, AspeedI2CBus, ASPEED_I2C_OLD_NUM_REG),
595
VMSTATE_END_OF_LIST()
596
}
597
};
598
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_reset(DeviceState *dev)
599
{
600
AspeedI2CBus *s = ASPEED_I2C_BUS(dev);
601
602
- s->intr_ctrl = 0;
603
- s->intr_status = 0;
604
- s->cmd = 0;
605
- s->buf = 0;
606
- s->dma_addr = 0;
607
- s->dma_len = 0;
608
+ memset(s->regs, 0, sizeof(s->regs));
609
i2c_end_transfer(s->bus);
610
}
611
612
@@ -XXX,XX +XXX,XX @@ static qemu_irq aspeed_2400_i2c_bus_get_irq(AspeedI2CBus *bus)
613
static uint8_t *aspeed_2400_i2c_bus_pool_base(AspeedI2CBus *bus)
614
{
615
uint8_t *pool_page =
616
- &bus->controller->pool[FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL,
617
- POOL_PAGE_SEL) * 0x100];
618
+ &bus->controller->pool[ARRAY_FIELD_EX32(bus->regs, I2CD_FUN_CTRL,
619
+ POOL_PAGE_SEL) * 0x100];
620
621
- return &pool_page[FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, OFFSET)];
622
+ return &pool_page[ARRAY_FIELD_EX32(bus->regs, I2CD_POOL_CTRL, OFFSET)];
623
}
624
625
static void aspeed_2400_i2c_class_init(ObjectClass *klass, void *data)
626
--
141
--
627
2.35.3
142
2.47.1
628
143
629
144
diff view generated by jsdifflib
1
From: Joe Komlodi <komlodi@google.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
This cleans up some of the field accessing, setting, and clearing
3
The testcases for ASPEED SMC model were placed in aspeed_smc-test.c.
4
bitwise operations, and wraps them in macros instead.
4
However, this test file only supports for ARM32. To support all ASPEED SOCs
5
such as AST2700 whose CPU architecture is aarch64, introduces a new
6
aspeed-smc-utils source file and move all common APIs and testcases
7
from aspeed_smc-test.c to aspeed-smc-utils.c.
5
8
6
Signed-off-by: Joe Komlodi <komlodi@google.com>
9
Finally, users are able to re-used these testcase for AST2700 and future
7
Change-Id: I33018d6325fa04376e7c29dc4a49ab389a8e333a
10
ASPEED SOCs testing.
8
Message-Id: <20220331043248.2237838-4-komlodi@google.com>
11
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
13
Reviewed-by: Cédric Le Goater <clg@redhat.com>
14
Link: https://lore.kernel.org/r/20241127091543.1243114-10-jamin_lin@aspeedtech.com
15
Signed-off-by: Cédric Le Goater <clg@redhat.com>
10
---
16
---
11
hw/i2c/aspeed_i2c.c | 393 ++++++++++++++++++++++----------------------
17
tests/qtest/aspeed-smc-utils.h | 95 ++++
12
1 file changed, 196 insertions(+), 197 deletions(-)
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
13
24
14
diff --git a/hw/i2c/aspeed_i2c.c b/hw/i2c/aspeed_i2c.c
25
diff --git a/tests/qtest/aspeed-smc-utils.h b/tests/qtest/aspeed-smc-utils.h
26
new file mode 100644
27
index XXXXXXX..XXXXXXX
28
--- /dev/null
29
+++ b/tests/qtest/aspeed-smc-utils.h
30
@@ -XXX,XX +XXX,XX @@
31
+/*
32
+ * QTest testcase for the M25P80 Flash (Using the Aspeed SPI
33
+ * Controller)
34
+ *
35
+ * Copyright (C) 2016 IBM Corp.
36
+ *
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
15
index XXXXXXX..XXXXXXX 100644
819
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/i2c/aspeed_i2c.c
820
--- a/tests/qtest/aspeed_smc-test.c
17
+++ b/hw/i2c/aspeed_i2c.c
821
+++ b/tests/qtest/aspeed_smc-test.c
18
@@ -XXX,XX +XXX,XX @@
822
@@ -XXX,XX +XXX,XX @@
19
#include "hw/i2c/aspeed_i2c.h"
823
#include "qemu/bswap.h"
20
#include "hw/irq.h"
824
#include "libqtest-single.h"
21
#include "hw/qdev-properties.h"
825
#include "qemu/bitops.h"
22
+#include "hw/registerfields.h"
826
+#include "aspeed-smc-utils.h"
23
#include "trace.h"
827
24
828
-/*
25
/* I2C Global Register */
829
- * ASPEED SPI Controller registers
26
-
830
- */
27
-#define I2C_CTRL_STATUS 0x00 /* Device Interrupt Status */
831
-#define R_CONF 0x00
28
-#define I2C_CTRL_ASSIGN 0x08 /* Device Interrupt Target
832
-#define CONF_ENABLE_W0 16
29
- Assignment */
833
-#define R_CE_CTRL 0x04
30
-#define I2C_CTRL_GLOBAL 0x0C /* Global Control Register */
834
-#define CRTL_EXTENDED0 0 /* 32 bit addressing for SPI */
31
-#define I2C_CTRL_SRAM_EN BIT(0)
835
-#define R_CTRL0 0x10
32
+REG32(I2C_CTRL_STATUS, 0x0) /* Device Interrupt Status */
836
-#define CTRL_IO_QUAD_IO BIT(31)
33
+REG32(I2C_CTRL_ASSIGN, 0x8) /* Device Interrupt Target Assignment */
837
-#define CTRL_CE_STOP_ACTIVE BIT(2)
34
+REG32(I2C_CTRL_GLOBAL, 0xC) /* Global Control Register */
838
-#define CTRL_READMODE 0x0
35
+ FIELD(I2C_CTRL_GLOBAL, SRAM_EN, 0, 1)
839
-#define CTRL_FREADMODE 0x1
36
840
-#define CTRL_WRITEMODE 0x2
37
/* I2C Device (Bus) Register */
841
-#define CTRL_USERMODE 0x3
38
-
842
-#define SR_WEL BIT(1)
39
-#define I2CD_FUN_CTRL_REG 0x00 /* I2CD Function Control */
843
-
40
-#define I2CD_POOL_PAGE_SEL(x) (((x) >> 20) & 0x7) /* AST2400 */
844
-/*
41
-#define I2CD_M_SDA_LOCK_EN (0x1 << 16)
845
- * Flash commands
42
-#define I2CD_MULTI_MASTER_DIS (0x1 << 15)
846
- */
43
-#define I2CD_M_SCL_DRIVE_EN (0x1 << 14)
847
-enum {
44
-#define I2CD_MSB_STS (0x1 << 9)
848
- JEDEC_READ = 0x9f,
45
-#define I2CD_SDA_DRIVE_1T_EN (0x1 << 8)
849
- RDSR = 0x5,
46
-#define I2CD_M_SDA_DRIVE_1T_EN (0x1 << 7)
850
- WRDI = 0x4,
47
-#define I2CD_M_HIGH_SPEED_EN (0x1 << 6)
851
- BULK_ERASE = 0xc7,
48
-#define I2CD_DEF_ADDR_EN (0x1 << 5)
852
- READ = 0x03,
49
-#define I2CD_DEF_ALERT_EN (0x1 << 4)
853
- PP = 0x02,
50
-#define I2CD_DEF_ARP_EN (0x1 << 3)
854
- WRSR = 0x1,
51
-#define I2CD_DEF_GCALL_EN (0x1 << 2)
855
- WREN = 0x6,
52
-#define I2CD_SLAVE_EN (0x1 << 1)
856
- SRWD = 0x80,
53
-#define I2CD_MASTER_EN (0x1)
857
- RESET_ENABLE = 0x66,
54
-
858
- RESET_MEMORY = 0x99,
55
-#define I2CD_AC_TIMING_REG1 0x04 /* Clock and AC Timing Control #1 */
859
- EN_4BYTE_ADDR = 0xB7,
56
-#define I2CD_AC_TIMING_REG2 0x08 /* Clock and AC Timing Control #1 */
860
- ERASE_SECTOR = 0xd8,
57
-#define I2CD_INTR_CTRL_REG 0x0c /* I2CD Interrupt Control */
861
-};
58
-#define I2CD_INTR_STS_REG 0x10 /* I2CD Interrupt Status */
862
-
59
-
863
-#define CTRL_IO_MODE_MASK (BIT(31) | BIT(30) | BIT(29) | BIT(28))
60
-#define I2CD_INTR_SLAVE_ADDR_MATCH (0x1 << 31) /* 0: addr1 1: addr2 */
864
-#define FLASH_PAGE_SIZE 256
61
-#define I2CD_INTR_SLAVE_ADDR_RX_PENDING (0x1 << 30)
865
-
62
-/* bits[19-16] Reserved */
866
-typedef struct TestData {
63
-
867
- QTestState *s;
64
-/* All bits below are cleared by writing 1 */
868
- uint64_t spi_base;
65
-#define I2CD_INTR_SLAVE_INACTIVE_TIMEOUT (0x1 << 15)
869
- uint64_t flash_base;
66
-#define I2CD_INTR_SDA_DL_TIMEOUT (0x1 << 14)
870
- uint32_t jedec_id;
67
-#define I2CD_INTR_BUS_RECOVER_DONE (0x1 << 13)
871
- char *tmp_path;
68
-#define I2CD_INTR_SMBUS_ALERT (0x1 << 12) /* Bus [0-3] only */
872
- uint8_t cs;
69
-#define I2CD_INTR_SMBUS_ARP_ADDR (0x1 << 11) /* Removed */
873
- const char *node;
70
-#define I2CD_INTR_SMBUS_DEV_ALERT_ADDR (0x1 << 10) /* Removed */
874
- uint32_t page_addr;
71
-#define I2CD_INTR_SMBUS_DEF_ADDR (0x1 << 9) /* Removed */
875
-} TestData;
72
-#define I2CD_INTR_GCALL_ADDR (0x1 << 8) /* Removed */
876
-
73
-#define I2CD_INTR_SLAVE_ADDR_RX_MATCH (0x1 << 7) /* use RX_DONE */
877
-/*
74
-#define I2CD_INTR_SCL_TIMEOUT (0x1 << 6)
878
- * Use an explicit bswap for the values read/wrote to the flash region
75
-#define I2CD_INTR_ABNORMAL (0x1 << 5)
879
- * as they are BE and the Aspeed CPU is LE.
76
-#define I2CD_INTR_NORMAL_STOP (0x1 << 4)
880
- */
77
-#define I2CD_INTR_ARBIT_LOSS (0x1 << 3)
881
-static inline uint32_t make_be32(uint32_t data)
78
-#define I2CD_INTR_RX_DONE (0x1 << 2)
882
-{
79
-#define I2CD_INTR_TX_NAK (0x1 << 1)
883
- return bswap32(data);
80
-#define I2CD_INTR_TX_ACK (0x1 << 0)
884
-}
81
-
885
-
82
-#define I2CD_CMD_REG 0x14 /* I2CD Command/Status */
886
-static inline void spi_writel(const TestData *data, uint64_t offset,
83
-#define I2CD_SDA_OE (0x1 << 28)
887
- uint32_t value)
84
-#define I2CD_SDA_O (0x1 << 27)
888
-{
85
-#define I2CD_SCL_OE (0x1 << 26)
889
- qtest_writel(data->s, data->spi_base + offset, value);
86
-#define I2CD_SCL_O (0x1 << 25)
890
-}
87
-#define I2CD_TX_TIMING (0x1 << 24)
891
-
88
-#define I2CD_TX_STATUS (0x1 << 23)
892
-static inline uint32_t spi_readl(const TestData *data, uint64_t offset)
89
-
893
-{
90
-#define I2CD_TX_STATE_SHIFT 19 /* Tx State Machine */
894
- return qtest_readl(data->s, data->spi_base + offset);
91
+REG32(I2CD_FUN_CTRL, 0x0) /* I2CD Function Control */
895
-}
92
+ FIELD(I2CD_FUN_CTRL, POOL_PAGE_SEL, 20, 3) /* AST2400 */
896
-
93
+ FIELD(I2CD_FUN_CTRL, M_SDA_LOCK_EN, 16, 1)
897
-static inline void flash_writeb(const TestData *data, uint64_t offset,
94
+ FIELD(I2CD_FUN_CTRL, MULTI_MASTER_DIS, 15, 1)
898
- uint8_t value)
95
+ FIELD(I2CD_FUN_CTRL, M_SCL_DRIVE_EN, 14, 1)
899
-{
96
+ FIELD(I2CD_FUN_CTRL, MSB_STS, 9, 1)
900
- qtest_writeb(data->s, data->flash_base + offset, value);
97
+ FIELD(I2CD_FUN_CTRL, SDA_DRIVE_IT_EN, 8, 1)
901
-}
98
+ FIELD(I2CD_FUN_CTRL, M_SDA_DRIVE_IT_EN, 7, 1)
902
-
99
+ FIELD(I2CD_FUN_CTRL, M_HIGH_SPEED_EN, 6, 1)
903
-static inline void flash_writel(const TestData *data, uint64_t offset,
100
+ FIELD(I2CD_FUN_CTRL, DEF_ADDR_EN, 5, 1)
904
- uint32_t value)
101
+ FIELD(I2CD_FUN_CTRL, DEF_ALERT_EN, 4, 1)
905
-{
102
+ FIELD(I2CD_FUN_CTRL, DEF_ARP_EN, 3, 1)
906
- qtest_writel(data->s, data->flash_base + offset, value);
103
+ FIELD(I2CD_FUN_CTRL, DEF_GCALL_EN, 2, 1)
907
-}
104
+ FIELD(I2CD_FUN_CTRL, SLAVE_EN, 1, 1)
908
-
105
+ FIELD(I2CD_FUN_CTRL, MASTER_EN, 0, 1)
909
-static inline uint8_t flash_readb(const TestData *data, uint64_t offset)
106
+REG32(I2CD_AC_TIMING1, 0x04) /* Clock and AC Timing Control #1 */
910
-{
107
+REG32(I2CD_AC_TIMING2, 0x08) /* Clock and AC Timing Control #2 */
911
- return qtest_readb(data->s, data->flash_base + offset);
108
+REG32(I2CD_INTR_CTRL, 0x0C) /* I2CD Interrupt Control */
912
-}
109
+REG32(I2CD_INTR_STS, 0x10) /* I2CD Interrupt Status */
913
-
110
+ FIELD(I2CD_INTR_STS, SLAVE_ADDR_MATCH, 31, 1) /* 0: addr1 1: addr2 */
914
-static inline uint32_t flash_readl(const TestData *data, uint64_t offset)
111
+ FIELD(I2CD_INTR_STS, SLAVE_ADDR_RX_PENDING, 29, 1)
915
-{
112
+ FIELD(I2CD_INTR_STS, SLAVE_INACTIVE_TIMEOUT, 15, 1)
916
- return qtest_readl(data->s, data->flash_base + offset);
113
+ FIELD(I2CD_INTR_STS, SDA_DL_TIMEOUT, 14, 1)
917
-}
114
+ FIELD(I2CD_INTR_STS, BUS_RECOVER_DONE, 13, 1)
918
-
115
+ FIELD(I2CD_INTR_STS, SMBUS_ALERT, 12, 1) /* Bus [0-3] only */
919
-static void spi_conf(const TestData *data, uint32_t value)
116
+ FIELD(I2CD_INTR_STS, SMBUS_ARP_ADDR, 11, 1) /* Removed */
920
-{
117
+ FIELD(I2CD_INTR_STS, SMBUS_DEV_ALERT_ADDR, 10, 1) /* Removed */
921
- uint32_t conf = spi_readl(data, R_CONF);
118
+ FIELD(I2CD_INTR_STS, SMBUS_DEF_ADDR, 9, 1) /* Removed */
922
-
119
+ FIELD(I2CD_INTR_STS, GCALL_ADDR, 8, 1) /* Removed */
923
- conf |= value;
120
+ FIELD(I2CD_INTR_STS, SLAVE_ADDR_RX_MATCH, 7, 1) /* use RX_DONE */
924
- spi_writel(data, R_CONF, conf);
121
+ FIELD(I2CD_INTR_STS, SCL_TIMEOUT, 6, 1)
925
-}
122
+ FIELD(I2CD_INTR_STS, ABNORMAL, 5, 1)
926
-
123
+ FIELD(I2CD_INTR_STS, NORMAL_STOP, 4, 1)
927
-static void spi_conf_remove(const TestData *data, uint32_t value)
124
+ FIELD(I2CD_INTR_STS, ARBIT_LOSS, 3, 1)
928
-{
125
+ FIELD(I2CD_INTR_STS, RX_DONE, 2, 1)
929
- uint32_t conf = spi_readl(data, R_CONF);
126
+ FIELD(I2CD_INTR_STS, TX_NAK, 1, 1)
930
-
127
+ FIELD(I2CD_INTR_STS, TX_ACK, 0, 1)
931
- conf &= ~value;
128
+REG32(I2CD_CMD, 0x14) /* I2CD Command/Status */
932
- spi_writel(data, R_CONF, conf);
129
+ FIELD(I2CD_CMD, SDA_OE, 28, 1)
933
-}
130
+ FIELD(I2CD_CMD, SDA_O, 27, 1)
934
-
131
+ FIELD(I2CD_CMD, SCL_OE, 26, 1)
935
-static void spi_ce_ctrl(const TestData *data, uint32_t value)
132
+ FIELD(I2CD_CMD, SCL_O, 25, 1)
936
-{
133
+ FIELD(I2CD_CMD, TX_TIMING, 23, 2)
937
- uint32_t conf = spi_readl(data, R_CE_CTRL);
134
+ FIELD(I2CD_CMD, TX_STATE, 19, 4)
938
-
135
+/* Tx State Machine */
939
- conf |= value;
136
#define I2CD_TX_STATE_MASK 0xf
940
- spi_writel(data, R_CE_CTRL, conf);
137
#define I2CD_IDLE 0x0
941
-}
138
#define I2CD_MACTIVE 0x8
942
-
139
@@ -XXX,XX +XXX,XX @@
943
-static void spi_ctrl_setmode(const TestData *data, uint8_t mode, uint8_t cmd)
140
#define I2CD_STXD 0x6
944
-{
141
#define I2CD_SRXACK 0x7
945
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
142
#define I2CD_RECOVER 0x3
946
- uint32_t ctrl = spi_readl(data, ctrl_reg);
143
-
947
- ctrl &= ~(CTRL_USERMODE | 0xff << 16);
144
-#define I2CD_SCL_LINE_STS (0x1 << 18)
948
- ctrl |= mode | (cmd << 16);
145
-#define I2CD_SDA_LINE_STS (0x1 << 17)
949
- spi_writel(data, ctrl_reg, ctrl);
146
-#define I2CD_BUS_BUSY_STS (0x1 << 16)
950
-}
147
-#define I2CD_SDA_OE_OUT_DIR (0x1 << 15)
951
-
148
-#define I2CD_SDA_O_OUT_DIR (0x1 << 14)
952
-static void spi_ctrl_start_user(const TestData *data)
149
-#define I2CD_SCL_OE_OUT_DIR (0x1 << 13)
953
-{
150
-#define I2CD_SCL_O_OUT_DIR (0x1 << 12)
954
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
151
-#define I2CD_BUS_RECOVER_CMD_EN (0x1 << 11)
955
- uint32_t ctrl = spi_readl(data, ctrl_reg);
152
-#define I2CD_S_ALT_EN (0x1 << 10)
956
-
153
-
957
- ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
154
-/* Command Bit */
958
- spi_writel(data, ctrl_reg, ctrl);
155
-#define I2CD_RX_DMA_ENABLE (0x1 << 9)
959
-
156
-#define I2CD_TX_DMA_ENABLE (0x1 << 8)
960
- ctrl &= ~CTRL_CE_STOP_ACTIVE;
157
-#define I2CD_RX_BUFF_ENABLE (0x1 << 7)
961
- spi_writel(data, ctrl_reg, ctrl);
158
-#define I2CD_TX_BUFF_ENABLE (0x1 << 6)
962
-}
159
-#define I2CD_M_STOP_CMD (0x1 << 5)
963
-
160
-#define I2CD_M_S_RX_CMD_LAST (0x1 << 4)
964
-static void spi_ctrl_stop_user(const TestData *data)
161
-#define I2CD_M_RX_CMD (0x1 << 3)
965
-{
162
-#define I2CD_S_TX_CMD (0x1 << 2)
966
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
163
-#define I2CD_M_TX_CMD (0x1 << 1)
967
- uint32_t ctrl = spi_readl(data, ctrl_reg);
164
-#define I2CD_M_START_CMD (0x1)
968
-
165
-
969
- ctrl |= CTRL_USERMODE | CTRL_CE_STOP_ACTIVE;
166
-#define I2CD_DEV_ADDR_REG 0x18 /* Slave Device Address */
970
- spi_writel(data, ctrl_reg, ctrl);
167
-#define I2CD_POOL_CTRL_REG 0x1c /* Pool Buffer Control */
971
-}
168
-#define I2CD_POOL_RX_COUNT(x) (((x) >> 24) & 0xff)
972
-
169
-#define I2CD_POOL_RX_SIZE(x) ((((x) >> 16) & 0xff) + 1)
973
-static void spi_ctrl_set_io_mode(const TestData *data, uint32_t value)
170
-#define I2CD_POOL_TX_COUNT(x) ((((x) >> 8) & 0xff) + 1)
974
-{
171
-#define I2CD_POOL_OFFSET(x) (((x) & 0x3f) << 2) /* AST2400 */
975
- uint32_t ctrl_reg = R_CTRL0 + data->cs * 4;
172
-#define I2CD_BYTE_BUF_REG 0x20 /* Transmit/Receive Byte Buffer */
976
- uint32_t ctrl = spi_readl(data, ctrl_reg);
173
-#define I2CD_BYTE_BUF_TX_SHIFT 0
977
- uint32_t mode;
174
-#define I2CD_BYTE_BUF_TX_MASK 0xff
978
-
175
-#define I2CD_BYTE_BUF_RX_SHIFT 8
979
- mode = value & CTRL_IO_MODE_MASK;
176
-#define I2CD_BYTE_BUF_RX_MASK 0xff
980
- ctrl &= ~CTRL_IO_MODE_MASK;
177
-#define I2CD_DMA_ADDR 0x24 /* DMA Buffer Address */
981
- ctrl |= mode;
178
-#define I2CD_DMA_LEN 0x28 /* DMA Transfer Length < 4KB */
982
- spi_writel(data, ctrl_reg, ctrl);
179
+ FIELD(I2CD_CMD, SCL_LINE_STS, 18, 1)
983
-}
180
+ FIELD(I2CD_CMD, SDA_LINE_STS, 17, 1)
984
-
181
+ FIELD(I2CD_CMD, BUS_BUSY_STS, 16, 1)
985
-static void flash_reset(const TestData *data)
182
+ FIELD(I2CD_CMD, SDA_OE_OUT_DIR, 15, 1)
986
-{
183
+ FIELD(I2CD_CMD, SDA_O_OUT_DIR, 14, 1)
987
- spi_conf(data, 1 << (CONF_ENABLE_W0 + data->cs));
184
+ FIELD(I2CD_CMD, SCL_OE_OUT_DIR, 13, 1)
988
-
185
+ FIELD(I2CD_CMD, SCL_O_OUT_DIR, 12, 1)
989
- spi_ctrl_start_user(data);
186
+ FIELD(I2CD_CMD, BUS_RECOVER_CMD_EN, 11, 1)
990
- flash_writeb(data, 0, RESET_ENABLE);
187
+ FIELD(I2CD_CMD, S_ALT_EN, 10, 1)
991
- flash_writeb(data, 0, RESET_MEMORY);
188
+ /* Command Bits */
992
- flash_writeb(data, 0, WREN);
189
+ FIELD(I2CD_CMD, RX_DMA_EN, 9, 1)
993
- flash_writeb(data, 0, BULK_ERASE);
190
+ FIELD(I2CD_CMD, TX_DMA_EN, 8, 1)
994
- flash_writeb(data, 0, WRDI);
191
+ FIELD(I2CD_CMD, RX_BUFF_EN, 7, 1)
995
- spi_ctrl_stop_user(data);
192
+ FIELD(I2CD_CMD, TX_BUFF_EN, 6, 1)
996
-
193
+ FIELD(I2CD_CMD, M_STOP_CMD, 5, 1)
997
- spi_conf_remove(data, 1 << (CONF_ENABLE_W0 + data->cs));
194
+ FIELD(I2CD_CMD, M_S_RX_CMD_LAST, 4, 1)
998
-}
195
+ FIELD(I2CD_CMD, M_RX_CMD, 3, 1)
999
-
196
+ FIELD(I2CD_CMD, S_TX_CMD, 2, 1)
1000
-static void test_read_jedec(const void *data)
197
+ FIELD(I2CD_CMD, M_TX_CMD, 1, 1)
1001
-{
198
+ FIELD(I2CD_CMD, M_START_CMD, 0, 1)
1002
- const TestData *test_data = (const TestData *)data;
199
+REG32(I2CD_DEV_ADDR, 0x18) /* Slave Device Address */
1003
- uint32_t jedec = 0x0;
200
+REG32(I2CD_POOL_CTRL, 0x1C) /* Pool Buffer Control */
1004
-
201
+ FIELD(I2CD_POOL_CTRL, RX_COUNT, 24, 5)
1005
- spi_conf(test_data, 1 << (CONF_ENABLE_W0 + test_data->cs));
202
+ FIELD(I2CD_POOL_CTRL, RX_SIZE, 16, 5)
1006
-
203
+ FIELD(I2CD_POOL_CTRL, TX_COUNT, 9, 5)
1007
- spi_ctrl_start_user(test_data);
204
+ FIELD(I2CD_POOL_CTRL, OFFSET, 2, 6) /* AST2400 */
1008
- flash_writeb(test_data, 0, JEDEC_READ);
205
+REG32(I2CD_BYTE_BUF, 0x20) /* Transmit/Receive Byte Buffer */
1009
- jedec |= flash_readb(test_data, 0) << 16;
206
+ FIELD(I2CD_BYTE_BUF, RX_BUF, 8, 8)
1010
- jedec |= flash_readb(test_data, 0) << 8;
207
+ FIELD(I2CD_BYTE_BUF, TX_BUF, 0, 8)
1011
- jedec |= flash_readb(test_data, 0);
208
+REG32(I2CD_DMA_ADDR, 0x24) /* DMA Buffer Address */
1012
- spi_ctrl_stop_user(test_data);
209
+REG32(I2CD_DMA_LEN, 0x28) /* DMA Transfer Length < 4KB */
1013
-
210
1014
- flash_reset(test_data);
211
static inline bool aspeed_i2c_bus_is_master(AspeedI2CBus *bus)
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)
212
{
1529
{
213
- return bus->ctrl & I2CD_MASTER_EN;
1530
int ret;
214
+ return FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL, MASTER_EN);
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);
215
}
1566
}
216
1567
217
static inline bool aspeed_i2c_bus_is_enabled(AspeedI2CBus *bus)
1568
-static void test_ast2500_evb(TestData *data)
1569
+static void test_ast2500_evb(AspeedSMCTestData *data)
218
{
1570
{
219
- return bus->ctrl & (I2CD_MASTER_EN | I2CD_SLAVE_EN);
1571
int ret;
220
+ return FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL, MASTER_EN) ||
1572
int fd;
221
+ FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL, SLAVE_EN);
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);
222
}
1601
}
223
1602
224
static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
1603
-static void test_ast2600_evb(TestData *data)
225
@@ -XXX,XX +XXX,XX @@ static inline void aspeed_i2c_bus_raise_interrupt(AspeedI2CBus *bus)
1604
+static void test_ast2600_evb(AspeedSMCTestData *data)
226
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
227
228
trace_aspeed_i2c_bus_raise_interrupt(bus->intr_status,
229
- bus->intr_status & I2CD_INTR_TX_NAK ? "nak|" : "",
230
- bus->intr_status & I2CD_INTR_TX_ACK ? "ack|" : "",
231
- bus->intr_status & I2CD_INTR_RX_DONE ? "done|" : "",
232
- bus->intr_status & I2CD_INTR_NORMAL_STOP ? "normal|" : "",
233
- bus->intr_status & I2CD_INTR_ABNORMAL ? "abnormal" : "");
234
+ FIELD_EX32(bus->intr_status, I2CD_INTR_STS, TX_NAK) ? "nak|" : "",
235
+ FIELD_EX32(bus->intr_status, I2CD_INTR_STS, TX_ACK) ? "ack|" : "",
236
+ FIELD_EX32(bus->intr_status, I2CD_INTR_STS, RX_DONE) ? "done|" : "",
237
+ FIELD_EX32(bus->intr_status, I2CD_INTR_STS, NORMAL_STOP) ? "normal|"
238
+ : "",
239
+ FIELD_EX32(bus->intr_status, I2CD_INTR_STS, ABNORMAL) ? "abnormal"
240
+ : "");
241
242
bus->intr_status &= bus->intr_ctrl;
243
if (bus->intr_status) {
244
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
245
uint64_t value = -1;
246
247
switch (offset) {
248
- case I2CD_FUN_CTRL_REG:
249
+ case A_I2CD_FUN_CTRL:
250
value = bus->ctrl;
251
break;
252
- case I2CD_AC_TIMING_REG1:
253
+ case A_I2CD_AC_TIMING1:
254
value = bus->timing[0];
255
break;
256
- case I2CD_AC_TIMING_REG2:
257
+ case A_I2CD_AC_TIMING2:
258
value = bus->timing[1];
259
break;
260
- case I2CD_INTR_CTRL_REG:
261
+ case A_I2CD_INTR_CTRL:
262
value = bus->intr_ctrl;
263
break;
264
- case I2CD_INTR_STS_REG:
265
+ case A_I2CD_INTR_STS:
266
value = bus->intr_status;
267
break;
268
- case I2CD_POOL_CTRL_REG:
269
+ case A_I2CD_POOL_CTRL:
270
value = bus->pool_ctrl;
271
break;
272
- case I2CD_BYTE_BUF_REG:
273
+ case A_I2CD_BYTE_BUF:
274
value = bus->buf;
275
break;
276
- case I2CD_CMD_REG:
277
+ case A_I2CD_CMD:
278
value = bus->cmd | (i2c_bus_busy(bus->bus) << 16);
279
break;
280
- case I2CD_DMA_ADDR:
281
+ case A_I2CD_DMA_ADDR:
282
if (!aic->has_dma) {
283
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
284
break;
285
}
286
value = bus->dma_addr;
287
break;
288
- case I2CD_DMA_LEN:
289
+ case A_I2CD_DMA_LEN:
290
if (!aic->has_dma) {
291
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
292
break;
293
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_bus_read(void *opaque, hwaddr offset,
294
295
static void aspeed_i2c_set_state(AspeedI2CBus *bus, uint8_t state)
296
{
1605
{
297
- bus->cmd &= ~(I2CD_TX_STATE_MASK << I2CD_TX_STATE_SHIFT);
1606
int ret;
298
- bus->cmd |= (state & I2CD_TX_STATE_MASK) << I2CD_TX_STATE_SHIFT;
1607
int fd;
299
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, TX_STATE, state);
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);
300
}
1636
}
301
1637
302
static uint8_t aspeed_i2c_get_state(AspeedI2CBus *bus)
1638
-static void test_ast1030_evb(TestData *data)
1639
+static void test_ast1030_evb(AspeedSMCTestData *data)
303
{
1640
{
304
- return (bus->cmd >> I2CD_TX_STATE_SHIFT) & I2CD_TX_STATE_MASK;
1641
int ret;
305
+ return FIELD_EX32(bus->cmd, I2CD_CMD, TX_STATE);
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);
306
}
1671
}
307
1672
308
static int aspeed_i2c_dma_read(AspeedI2CBus *bus, uint8_t *data)
1673
int main(int argc, char **argv)
309
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
1674
{
310
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
1675
- TestData palmetto_data;
311
int ret = -1;
1676
- TestData ast2500_evb_data;
312
int i;
1677
- TestData ast2600_evb_data;
313
+ int pool_tx_count = FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, TX_COUNT);
1678
- TestData ast1030_evb_data;
314
1679
+ AspeedSMCTestData palmetto_data;
315
- if (bus->cmd & I2CD_TX_BUFF_ENABLE) {
1680
+ AspeedSMCTestData ast2500_evb_data;
316
- for (i = pool_start; i < I2CD_POOL_TX_COUNT(bus->pool_ctrl); i++) {
1681
+ AspeedSMCTestData ast2600_evb_data;
317
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN)) {
1682
+ AspeedSMCTestData ast1030_evb_data;
318
+ for (i = pool_start; i < pool_tx_count; i++) {
1683
int ret;
319
uint8_t *pool_base = aic->bus_pool_base(bus);
1684
320
1685
g_test_init(&argc, &argv, NULL);
321
- trace_aspeed_i2c_bus_send("BUF", i + 1,
1686
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
322
- I2CD_POOL_TX_COUNT(bus->pool_ctrl),
1687
index XXXXXXX..XXXXXXX 100644
323
+ trace_aspeed_i2c_bus_send("BUF", i + 1, pool_tx_count,
1688
--- a/tests/qtest/meson.build
324
pool_base[i]);
1689
+++ b/tests/qtest/meson.build
325
ret = i2c_send(bus->bus, pool_base[i]);
1690
@@ -XXX,XX +XXX,XX @@ qtests = {
326
if (ret) {
1691
'virtio-net-failover': files('migration-helpers.c'),
327
break;
1692
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
328
}
1693
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
329
}
1694
+ 'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
330
- bus->cmd &= ~I2CD_TX_BUFF_ENABLE;
331
- } else if (bus->cmd & I2CD_TX_DMA_ENABLE) {
332
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, TX_BUFF_EN, 0);
333
+ } else if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN)) {
334
while (bus->dma_len) {
335
uint8_t data;
336
aspeed_i2c_dma_read(bus, &data);
337
@@ -XXX,XX +XXX,XX @@ static int aspeed_i2c_bus_send(AspeedI2CBus *bus, uint8_t pool_start)
338
break;
339
}
340
}
341
- bus->cmd &= ~I2CD_TX_DMA_ENABLE;
342
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, TX_DMA_EN, 0);
343
} else {
344
trace_aspeed_i2c_bus_send("BYTE", pool_start, 1, bus->buf);
345
ret = i2c_send(bus->bus, bus->buf);
346
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
347
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
348
uint8_t data;
349
int i;
350
+ int pool_rx_count = FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, RX_COUNT);
351
352
- if (bus->cmd & I2CD_RX_BUFF_ENABLE) {
353
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN)) {
354
uint8_t *pool_base = aic->bus_pool_base(bus);
355
356
- for (i = 0; i < I2CD_POOL_RX_SIZE(bus->pool_ctrl); i++) {
357
+ for (i = 0; i < pool_rx_count; i++) {
358
pool_base[i] = i2c_recv(bus->bus);
359
- trace_aspeed_i2c_bus_recv("BUF", i + 1,
360
- I2CD_POOL_RX_SIZE(bus->pool_ctrl),
361
+ trace_aspeed_i2c_bus_recv("BUF", i + 1, pool_rx_count,
362
pool_base[i]);
363
}
364
365
/* Update RX count */
366
- bus->pool_ctrl &= ~(0xff << 24);
367
- bus->pool_ctrl |= (i & 0xff) << 24;
368
- bus->cmd &= ~I2CD_RX_BUFF_ENABLE;
369
- } else if (bus->cmd & I2CD_RX_DMA_ENABLE) {
370
+ bus->pool_ctrl = FIELD_DP32(bus->pool_ctrl, I2CD_POOL_CTRL, RX_COUNT,
371
+ i & 0xff);
372
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, RX_BUFF_EN, 0);
373
+ } else if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN)) {
374
uint8_t data;
375
376
while (bus->dma_len) {
377
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_recv(AspeedI2CBus *bus)
378
bus->dma_addr++;
379
bus->dma_len--;
380
}
381
- bus->cmd &= ~I2CD_RX_DMA_ENABLE;
382
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, RX_DMA_EN, 0);
383
} else {
384
data = i2c_recv(bus->bus);
385
trace_aspeed_i2c_bus_recv("BYTE", 1, 1, bus->buf);
386
- bus->buf = (data & I2CD_BYTE_BUF_RX_MASK) << I2CD_BYTE_BUF_RX_SHIFT;
387
+ bus->buf = FIELD_DP32(bus->buf, I2CD_BYTE_BUF, RX_BUF, data);
388
}
389
}
1695
}
390
1696
391
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_handle_rx_cmd(AspeedI2CBus *bus)
1697
if vnc.found()
392
{
393
aspeed_i2c_set_state(bus, I2CD_MRXD);
394
aspeed_i2c_bus_recv(bus);
395
- bus->intr_status |= I2CD_INTR_RX_DONE;
396
- if (bus->cmd & I2CD_M_S_RX_CMD_LAST) {
397
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS, RX_DONE, 1);
398
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST)) {
399
i2c_nack(bus->bus);
400
}
401
- bus->cmd &= ~(I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST);
402
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_RX_CMD, 0);
403
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST, 0);
404
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
405
}
406
407
@@ -XXX,XX +XXX,XX @@ static uint8_t aspeed_i2c_get_addr(AspeedI2CBus *bus)
408
{
409
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(bus->controller);
410
411
- if (bus->cmd & I2CD_TX_BUFF_ENABLE) {
412
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN)) {
413
uint8_t *pool_base = aic->bus_pool_base(bus);
414
415
return pool_base[0];
416
- } else if (bus->cmd & I2CD_TX_DMA_ENABLE) {
417
+ } else if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN)) {
418
uint8_t data;
419
420
aspeed_i2c_dma_read(bus, &data);
421
@@ -XXX,XX +XXX,XX @@ static bool aspeed_i2c_check_sram(AspeedI2CBus *bus)
422
{
423
AspeedI2CState *s = bus->controller;
424
AspeedI2CClass *aic = ASPEED_I2C_GET_CLASS(s);
425
-
426
+ bool dma_en = FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN) ||
427
+ FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN) ||
428
+ FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN) ||
429
+ FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN);
430
if (!aic->check_sram) {
431
return true;
432
}
433
@@ -XXX,XX +XXX,XX @@ static bool aspeed_i2c_check_sram(AspeedI2CBus *bus)
434
* AST2500: SRAM must be enabled before using the Buffer Pool or
435
* DMA mode.
436
*/
437
- if (!(s->ctrl_global & I2C_CTRL_SRAM_EN) &&
438
- (bus->cmd & (I2CD_RX_DMA_ENABLE | I2CD_TX_DMA_ENABLE |
439
- I2CD_RX_BUFF_ENABLE | I2CD_TX_BUFF_ENABLE))) {
440
+ if (!FIELD_EX32(s->ctrl_global, I2C_CTRL_GLOBAL, SRAM_EN) && dma_en) {
441
qemu_log_mask(LOG_GUEST_ERROR, "%s: SRAM is not enabled\n", __func__);
442
return false;
443
}
444
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_cmd_dump(AspeedI2CBus *bus)
445
{
446
g_autofree char *cmd_flags = NULL;
447
uint32_t count;
448
-
449
- if (bus->cmd & (I2CD_RX_BUFF_ENABLE | I2CD_RX_BUFF_ENABLE)) {
450
- count = I2CD_POOL_TX_COUNT(bus->pool_ctrl);
451
- } else if (bus->cmd & (I2CD_RX_DMA_ENABLE | I2CD_RX_DMA_ENABLE)) {
452
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN)) {
453
+ count = FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, TX_COUNT);
454
+ } else if (FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN)) {
455
count = bus->dma_len;
456
} else { /* BYTE mode */
457
count = 1;
458
}
459
460
cmd_flags = g_strdup_printf("%s%s%s%s%s%s%s%s%s",
461
- bus->cmd & I2CD_M_START_CMD ? "start|" : "",
462
- bus->cmd & I2CD_RX_DMA_ENABLE ? "rxdma|" : "",
463
- bus->cmd & I2CD_TX_DMA_ENABLE ? "txdma|" : "",
464
- bus->cmd & I2CD_RX_BUFF_ENABLE ? "rxbuf|" : "",
465
- bus->cmd & I2CD_TX_BUFF_ENABLE ? "txbuf|" : "",
466
- bus->cmd & I2CD_M_TX_CMD ? "tx|" : "",
467
- bus->cmd & I2CD_M_RX_CMD ? "rx|" : "",
468
- bus->cmd & I2CD_M_S_RX_CMD_LAST ? "last|" : "",
469
- bus->cmd & I2CD_M_STOP_CMD ? "stop" : "");
470
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_START_CMD) ? "start|" : "",
471
+ FIELD_EX32(bus->cmd, I2CD_CMD, RX_DMA_EN) ? "rxdma|" : "",
472
+ FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN) ? "txdma|" : "",
473
+ FIELD_EX32(bus->cmd, I2CD_CMD, RX_BUFF_EN) ? "rxbuf|" : "",
474
+ FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN) ? "txbuf|" : "",
475
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_TX_CMD) ? "tx|" : "",
476
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_RX_CMD) ? "rx|" : "",
477
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST) ? "last|" : "",
478
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_STOP_CMD) ? "stop" : "");
479
480
trace_aspeed_i2c_bus_cmd(bus->cmd, cmd_flags, count, bus->intr_status);
481
}
482
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
483
aspeed_i2c_bus_cmd_dump(bus);
484
}
485
486
- if (bus->cmd & I2CD_M_START_CMD) {
487
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, M_START_CMD)) {
488
uint8_t state = aspeed_i2c_get_state(bus) & I2CD_MACTIVE ?
489
I2CD_MSTARTR : I2CD_MSTART;
490
uint8_t addr;
491
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
492
493
if (i2c_start_transfer(bus->bus, extract32(addr, 1, 7),
494
extract32(addr, 0, 1))) {
495
- bus->intr_status |= I2CD_INTR_TX_NAK;
496
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
497
+ TX_NAK, 1);
498
} else {
499
- bus->intr_status |= I2CD_INTR_TX_ACK;
500
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
501
+ TX_ACK, 1);
502
}
503
504
- bus->cmd &= ~I2CD_M_START_CMD;
505
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_START_CMD, 0);
506
507
/*
508
* The START command is also a TX command, as the slave
509
* address is sent on the bus. Drop the TX flag if nothing
510
* else needs to be sent in this sequence.
511
*/
512
- if (bus->cmd & I2CD_TX_BUFF_ENABLE) {
513
- if (I2CD_POOL_TX_COUNT(bus->pool_ctrl) == 1) {
514
- bus->cmd &= ~I2CD_M_TX_CMD;
515
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_BUFF_EN)) {
516
+ if (FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, TX_COUNT) == 1) {
517
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
518
} else {
519
/*
520
* Increase the start index in the TX pool buffer to
521
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
522
*/
523
pool_start++;
524
}
525
- } else if (bus->cmd & I2CD_TX_DMA_ENABLE) {
526
+ } else if (FIELD_EX32(bus->cmd, I2CD_CMD, TX_DMA_EN)) {
527
if (bus->dma_len == 0) {
528
- bus->cmd &= ~I2CD_M_TX_CMD;
529
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
530
}
531
} else {
532
- bus->cmd &= ~I2CD_M_TX_CMD;
533
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
534
}
535
536
/* No slave found */
537
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_handle_cmd(AspeedI2CBus *bus, uint64_t value)
538
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
539
}
540
541
- if (bus->cmd & I2CD_M_TX_CMD) {
542
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, M_TX_CMD)) {
543
aspeed_i2c_set_state(bus, I2CD_MTXD);
544
if (aspeed_i2c_bus_send(bus, pool_start)) {
545
- bus->intr_status |= (I2CD_INTR_TX_NAK);
546
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
547
+ TX_NAK, 1);
548
i2c_end_transfer(bus->bus);
549
} else {
550
- bus->intr_status |= I2CD_INTR_TX_ACK;
551
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
552
+ TX_ACK, 1);
553
}
554
- bus->cmd &= ~I2CD_M_TX_CMD;
555
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_TX_CMD, 0);
556
aspeed_i2c_set_state(bus, I2CD_MACTIVE);
557
}
558
559
- if ((bus->cmd & (I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST)) &&
560
- !(bus->intr_status & I2CD_INTR_RX_DONE)) {
561
+ if ((FIELD_EX32(bus->cmd, I2CD_CMD, M_RX_CMD) ||
562
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST)) &&
563
+ !FIELD_EX32(bus->intr_status, I2CD_INTR_STS, RX_DONE)) {
564
aspeed_i2c_handle_rx_cmd(bus);
565
}
566
567
- if (bus->cmd & I2CD_M_STOP_CMD) {
568
+ if (FIELD_EX32(bus->cmd, I2CD_CMD, M_STOP_CMD)) {
569
if (!(aspeed_i2c_get_state(bus) & I2CD_MACTIVE)) {
570
qemu_log_mask(LOG_GUEST_ERROR, "%s: abnormal stop\n", __func__);
571
- bus->intr_status |= I2CD_INTR_ABNORMAL;
572
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
573
+ ABNORMAL, 1);
574
} else {
575
aspeed_i2c_set_state(bus, I2CD_MSTOP);
576
i2c_end_transfer(bus->bus);
577
- bus->intr_status |= I2CD_INTR_NORMAL_STOP;
578
+ bus->intr_status = FIELD_DP32(bus->intr_status, I2CD_INTR_STS,
579
+ NORMAL_STOP, 1);
580
}
581
- bus->cmd &= ~I2CD_M_STOP_CMD;
582
+ bus->cmd = FIELD_DP32(bus->cmd, I2CD_CMD, M_STOP_CMD, 0);
583
aspeed_i2c_set_state(bus, I2CD_IDLE);
584
}
585
}
586
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
587
trace_aspeed_i2c_bus_write(bus->id, offset, size, value);
588
589
switch (offset) {
590
- case I2CD_FUN_CTRL_REG:
591
- if (value & I2CD_SLAVE_EN) {
592
+ case A_I2CD_FUN_CTRL:
593
+ if (FIELD_EX32(value, I2CD_FUN_CTRL, SLAVE_EN)) {
594
qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
595
__func__);
596
break;
597
}
598
bus->ctrl = value & 0x0071C3FF;
599
break;
600
- case I2CD_AC_TIMING_REG1:
601
+ case A_I2CD_AC_TIMING1:
602
bus->timing[0] = value & 0xFFFFF0F;
603
break;
604
- case I2CD_AC_TIMING_REG2:
605
+ case A_I2CD_AC_TIMING2:
606
bus->timing[1] = value & 0x7;
607
break;
608
- case I2CD_INTR_CTRL_REG:
609
+ case A_I2CD_INTR_CTRL:
610
bus->intr_ctrl = value & 0x7FFF;
611
break;
612
- case I2CD_INTR_STS_REG:
613
- handle_rx = (bus->intr_status & I2CD_INTR_RX_DONE) &&
614
- (value & I2CD_INTR_RX_DONE);
615
+ case A_I2CD_INTR_STS:
616
+ handle_rx = FIELD_EX32(bus->intr_status, I2CD_INTR_STS, RX_DONE) &&
617
+ FIELD_EX32(value, I2CD_INTR_STS, RX_DONE);
618
bus->intr_status &= ~(value & 0x7FFF);
619
if (!bus->intr_status) {
620
bus->controller->intr_status &= ~(1 << bus->id);
621
qemu_irq_lower(aic->bus_get_irq(bus));
622
}
623
- if (handle_rx && (bus->cmd & (I2CD_M_RX_CMD | I2CD_M_S_RX_CMD_LAST))) {
624
+ if (handle_rx && (FIELD_EX32(bus->cmd, I2CD_CMD, M_RX_CMD) ||
625
+ FIELD_EX32(bus->cmd, I2CD_CMD, M_S_RX_CMD_LAST))) {
626
aspeed_i2c_handle_rx_cmd(bus);
627
aspeed_i2c_bus_raise_interrupt(bus);
628
}
629
break;
630
- case I2CD_DEV_ADDR_REG:
631
+ case A_I2CD_DEV_ADDR:
632
qemu_log_mask(LOG_UNIMP, "%s: slave mode not implemented\n",
633
__func__);
634
break;
635
- case I2CD_POOL_CTRL_REG:
636
+ case A_I2CD_POOL_CTRL:
637
bus->pool_ctrl &= ~0xffffff;
638
bus->pool_ctrl |= (value & 0xffffff);
639
break;
640
641
- case I2CD_BYTE_BUF_REG:
642
- bus->buf = (value & I2CD_BYTE_BUF_TX_MASK) << I2CD_BYTE_BUF_TX_SHIFT;
643
+ case A_I2CD_BYTE_BUF:
644
+ bus->buf = FIELD_DP32(bus->buf, I2CD_BYTE_BUF, TX_BUF, value);
645
break;
646
- case I2CD_CMD_REG:
647
+ case A_I2CD_CMD:
648
if (!aspeed_i2c_bus_is_enabled(bus)) {
649
break;
650
}
651
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
652
}
653
654
if (!aic->has_dma &&
655
- value & (I2CD_RX_DMA_ENABLE | I2CD_TX_DMA_ENABLE)) {
656
+ (FIELD_EX32(value, I2CD_CMD, RX_DMA_EN) ||
657
+ FIELD_EX32(value, I2CD_CMD, TX_DMA_EN))) {
658
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
659
break;
660
}
661
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
662
aspeed_i2c_bus_handle_cmd(bus, value);
663
aspeed_i2c_bus_raise_interrupt(bus);
664
break;
665
- case I2CD_DMA_ADDR:
666
+ case A_I2CD_DMA_ADDR:
667
if (!aic->has_dma) {
668
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
669
break;
670
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_bus_write(void *opaque, hwaddr offset,
671
bus->dma_addr = value & 0x3ffffffc;
672
break;
673
674
- case I2CD_DMA_LEN:
675
+ case A_I2CD_DMA_LEN:
676
if (!aic->has_dma) {
677
qemu_log_mask(LOG_GUEST_ERROR, "%s: No DMA support\n", __func__);
678
break;
679
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_i2c_ctrl_read(void *opaque, hwaddr offset,
680
AspeedI2CState *s = opaque;
681
682
switch (offset) {
683
- case I2C_CTRL_STATUS:
684
+ case A_I2C_CTRL_STATUS:
685
return s->intr_status;
686
- case I2C_CTRL_GLOBAL:
687
+ case A_I2C_CTRL_GLOBAL:
688
return s->ctrl_global;
689
default:
690
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
691
@@ -XXX,XX +XXX,XX @@ static void aspeed_i2c_ctrl_write(void *opaque, hwaddr offset,
692
AspeedI2CState *s = opaque;
693
694
switch (offset) {
695
- case I2C_CTRL_GLOBAL:
696
+ case A_I2C_CTRL_GLOBAL:
697
s->ctrl_global = value;
698
break;
699
- case I2C_CTRL_STATUS:
700
+ case A_I2C_CTRL_STATUS:
701
default:
702
qemu_log_mask(LOG_GUEST_ERROR, "%s: Bad offset 0x%" HWADDR_PRIx "\n",
703
__func__, offset);
704
@@ -XXX,XX +XXX,XX @@ static qemu_irq aspeed_2400_i2c_bus_get_irq(AspeedI2CBus *bus)
705
static uint8_t *aspeed_2400_i2c_bus_pool_base(AspeedI2CBus *bus)
706
{
707
uint8_t *pool_page =
708
- &bus->controller->pool[I2CD_POOL_PAGE_SEL(bus->ctrl) * 0x100];
709
+ &bus->controller->pool[FIELD_EX32(bus->ctrl, I2CD_FUN_CTRL,
710
+ POOL_PAGE_SEL) * 0x100];
711
712
- return &pool_page[I2CD_POOL_OFFSET(bus->pool_ctrl)];
713
+ return &pool_page[FIELD_EX32(bus->pool_ctrl, I2CD_POOL_CTRL, OFFSET)];
714
}
715
716
static void aspeed_2400_i2c_class_init(ObjectClass *klass, void *data)
717
--
1698
--
718
2.35.3
1699
2.47.1
719
1700
720
1701
diff view generated by jsdifflib
1
From: Joe Komlodi <komlodi@google.com>
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
2
3
Occasionally a peripheral will have different operating modes, where the
3
Add test_ast2700_evb function and reused testcases which are from
4
MMIO layout changes, but some of the register fields have the same offsets
4
aspeed_smc-test.c for AST2700 testing. The base address, flash base address
5
and behaviors.
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.
6
8
7
To help support this, we add SHARED_FIELD_XX macros that create SHIFT,
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
LENGTH, and MASK macros for the fields that are shared across registers,
10
Reviewed-by: Cédric Le Goater <clg@redhat.com>
9
and accessors for these fields.
11
Link: https://lore.kernel.org/r/20241127091543.1243114-11-jamin_lin@aspeedtech.com
12
Signed-off-by: Cédric Le Goater <clg@redhat.com>
13
---
14
tests/qtest/ast2700-smc-test.c | 71 ++++++++++++++++++++++++++++++++++
15
tests/qtest/meson.build | 4 +-
16
2 files changed, 74 insertions(+), 1 deletion(-)
17
create mode 100644 tests/qtest/ast2700-smc-test.c
10
18
11
An example use may look as follows:
19
diff --git a/tests/qtest/ast2700-smc-test.c b/tests/qtest/ast2700-smc-test.c
12
There is a peripheral with registers REG_MODE1 and REG_MODE2 at
20
new file mode 100644
13
different addreses, and both have a field FIELD1 initialized by
21
index XXXXXXX..XXXXXXX
14
SHARED_FIELD().
22
--- /dev/null
15
23
+++ b/tests/qtest/ast2700-smc-test.c
16
Depending on what mode the peripheral is operating in, the user could
17
extract FIELD1 via
18
SHARED_ARRAY_FIELD_EX32(s->regs, R_REG_MODE1, FIELD1)
19
or
20
SHARED_ARRAY_FIELD_EX32(s->regs, R_REG_MODE2, FIELD1)
21
22
Signed-off-by: Joe Komlodi <komlodi@google.com>
23
Change-Id: Id3dc53e7d2f8741c95697cbae69a81bb699fa3cb
24
Message-Id: <20220331043248.2237838-2-komlodi@google.com>
25
Signed-off-by: Cédric Le Goater <clg@kaod.org>
26
---
27
include/hw/registerfields.h | 70 +++++++++++++++++++++++++++++++++++++
28
1 file changed, 70 insertions(+)
29
30
diff --git a/include/hw/registerfields.h b/include/hw/registerfields.h
31
index XXXXXXX..XXXXXXX 100644
32
--- a/include/hw/registerfields.h
33
+++ b/include/hw/registerfields.h
34
@@ -XXX,XX +XXX,XX @@
24
@@ -XXX,XX +XXX,XX @@
35
#define ARRAY_FIELD_DP64(regs, reg, field, val) \
36
(regs)[R_ ## reg] = FIELD_DP64((regs)[R_ ## reg], reg, field, val);
37
38
+
39
+/*
25
+/*
40
+ * These macros can be used for defining and extracting fields that have the
26
+ * QTest testcase for the M25P80 Flash using the ASPEED SPI Controller since
41
+ * same bit position across multiple registers.
27
+ * AST2700.
28
+ *
29
+ * SPDX-License-Identifier: GPL-2.0-or-later
30
+ * Copyright (C) 2024 ASPEED Technology Inc.
42
+ */
31
+ */
43
+
32
+
44
+/* Define shared SHIFT, LENGTH, and MASK constants */
33
+#include "qemu/osdep.h"
45
+#define SHARED_FIELD(name, shift, length) \
34
+#include "qemu/bswap.h"
46
+ enum { name ## _ ## SHIFT = (shift)}; \
35
+#include "libqtest-single.h"
47
+ enum { name ## _ ## LENGTH = (length)}; \
36
+#include "qemu/bitops.h"
48
+ enum { name ## _ ## MASK = MAKE_64BIT_MASK(shift, length)};
37
+#include "aspeed-smc-utils.h"
49
+
38
+
50
+/* Extract a shared field */
39
+static void test_ast2700_evb(AspeedSMCTestData *data)
51
+#define SHARED_FIELD_EX8(storage, field) \
40
+{
52
+ extract8((storage), field ## _SHIFT, field ## _LENGTH)
41
+ int ret;
42
+ int fd;
53
+
43
+
54
+#define SHARED_FIELD_EX16(storage, field) \
44
+ fd = g_file_open_tmp("qtest.m25p80.w25q01jvq.XXXXXX",
55
+ extract16((storage), field ## _SHIFT, field ## _LENGTH)
45
+ &data->tmp_path, NULL);
46
+ g_assert(fd >= 0);
47
+ ret = ftruncate(fd, 128 * 1024 * 1024);
48
+ g_assert(ret == 0);
49
+ close(fd);
56
+
50
+
57
+#define SHARED_FIELD_EX32(storage, field) \
51
+ data->s = qtest_initf("-machine ast2700-evb "
58
+ extract32((storage), field ## _SHIFT, field ## _LENGTH)
52
+ "-drive file=%s,format=raw,if=mtd",
53
+ data->tmp_path);
59
+
54
+
60
+#define SHARED_FIELD_EX64(storage, field) \
55
+ /* fmc cs0 with w25q01jvq flash */
61
+ extract64((storage), field ## _SHIFT, field ## _LENGTH)
56
+ data->flash_base = 0x100000000;
57
+ data->spi_base = 0x14000000;
58
+ data->jedec_id = 0xef4021;
59
+ data->cs = 0;
60
+ data->node = "/machine/soc/fmc/ssi.0/child[0]";
61
+ /* beyond 64MB */
62
+ data->page_addr = 0x40000 * FLASH_PAGE_SIZE;
62
+
63
+
63
+/* Extract a shared field from a register array */
64
+ qtest_add_data_func("/ast2700/smc/read_jedec",
64
+#define SHARED_ARRAY_FIELD_EX32(regs, offset, field) \
65
+ data, aspeed_smc_test_read_jedec);
65
+ SHARED_FIELD_EX32((regs)[(offset)], field)
66
+ qtest_add_data_func("/ast2700/smc/erase_sector",
66
+#define SHARED_ARRAY_FIELD_EX64(regs, offset, field) \
67
+ data, aspeed_smc_test_erase_sector);
67
+ SHARED_FIELD_EX64((regs)[(offset)], field)
68
+ qtest_add_data_func("/ast2700/smc/erase_all",
69
+ data, aspeed_smc_test_erase_all);
70
+ qtest_add_data_func("/ast2700/smc/write_page",
71
+ data, aspeed_smc_test_write_page);
72
+ qtest_add_data_func("/ast2700/smc/read_page_mem",
73
+ data, aspeed_smc_test_read_page_mem);
74
+ qtest_add_data_func("/ast2700/smc/write_page_mem",
75
+ data, aspeed_smc_test_write_page_mem);
76
+ qtest_add_data_func("/ast2700/smc/read_status_reg",
77
+ data, aspeed_smc_test_read_status_reg);
78
+ qtest_add_data_func("/ast2700/smc/write_page_qpi",
79
+ data, aspeed_smc_test_write_page_qpi);
80
+}
68
+
81
+
69
+/* Deposit a shared field */
82
+int main(int argc, char **argv)
70
+#define SHARED_FIELD_DP8(storage, field, val) ({ \
83
+{
71
+ struct { \
84
+ AspeedSMCTestData ast2700_evb_data;
72
+ unsigned int v:field ## _LENGTH; \
85
+ int ret;
73
+ } _v = { .v = val }; \
74
+ uint8_t _d; \
75
+ _d = deposit32((storage), field ## _SHIFT, field ## _LENGTH, _v.v); \
76
+ _d; })
77
+
86
+
78
+#define SHARED_FIELD_DP16(storage, field, val) ({ \
87
+ g_test_init(&argc, &argv, NULL);
79
+ struct { \
80
+ unsigned int v:field ## _LENGTH; \
81
+ } _v = { .v = val }; \
82
+ uint16_t _d; \
83
+ _d = deposit32((storage), field ## _SHIFT, field ## _LENGTH, _v.v); \
84
+ _d; })
85
+
88
+
86
+#define SHARED_FIELD_DP32(storage, field, val) ({ \
89
+ test_ast2700_evb(&ast2700_evb_data);
87
+ struct { \
90
+ ret = g_test_run();
88
+ unsigned int v:field ## _LENGTH; \
89
+ } _v = { .v = val }; \
90
+ uint32_t _d; \
91
+ _d = deposit32((storage), field ## _SHIFT, field ## _LENGTH, _v.v); \
92
+ _d; })
93
+
91
+
94
+#define SHARED_FIELD_DP64(storage, field, val) ({ \
92
+ qtest_quit(ast2700_evb_data.s);
95
+ struct { \
93
+ unlink(ast2700_evb_data.tmp_path);
96
+ uint64_t v:field ## _LENGTH; \
94
+ return ret;
97
+ } _v = { .v = val }; \
95
+}
98
+ uint64_t _d; \
96
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
99
+ _d = deposit64((storage), field ## _SHIFT, field ## _LENGTH, _v.v); \
97
index XXXXXXX..XXXXXXX 100644
100
+ _d; })
98
--- a/tests/qtest/meson.build
101
+
99
+++ b/tests/qtest/meson.build
102
+/* Deposit a shared field to a register array */
100
@@ -XXX,XX +XXX,XX @@ qtests_aspeed = \
103
+#define SHARED_ARRAY_FIELD_DP32(regs, offset, field, val) \
101
'aspeed_smc-test',
104
+ (regs)[(offset)] = SHARED_FIELD_DP32((regs)[(offset)], field, val);
102
'aspeed_gpio-test']
105
+#define SHARED_ARRAY_FIELD_DP64(regs, offset, field, val) \
103
qtests_aspeed64 = \
106
+ (regs)[(offset)] = SHARED_FIELD_DP64((regs)[(offset)], field, val);
104
- ['ast2700-gpio-test']
107
+
105
+ ['ast2700-gpio-test',
108
#endif
106
+ 'ast2700-smc-test']
107
108
qtests_stm32l4x5 = \
109
['stm32l4x5_exti-test',
110
@@ -XXX,XX +XXX,XX @@ qtests = {
111
'vmgenid-test': files('boot-sector.c', 'acpi-utils.c'),
112
'netdev-socket': files('netdev-socket.c', '../unit/socket-helpers.c'),
113
'aspeed_smc-test': files('aspeed-smc-utils.c', 'aspeed_smc-test.c'),
114
+ 'ast2700-smc-test': files('aspeed-smc-utils.c', 'ast2700-smc-test.c'),
115
}
116
117
if vnc.found()
109
--
118
--
110
2.35.3
119
2.47.1
111
120
112
121
diff view generated by jsdifflib