1
The following changes since commit f5643914a9e8f79c606a76e6a9d7ea82a3fc3e65:
1
The following changes since commit a95260486aa7e78d7c7194eba65cf03311ad94ad:
2
2
3
Merge tag 'pull-9p-20220501' of https://github.com/cschoenebeck/qemu into staging (2022-05-01 07:48:11 -0700)
3
Merge tag 'pull-tcg-20231023' of https://gitlab.com/rth7680/qemu into staging (2023-10-23 14:45:46 -0700)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20220503
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20231025
8
8
9
for you to fetch changes up to e056c52233910ef156e6d790ce41b33cd838bad6:
9
for you to fetch changes up to dd41ce7a6f13ad4f45ebaf52b9fa91fe5fc961df:
10
10
11
aspeed/hace: Support AST1030 HACE (2022-05-03 07:17:20 +0200)
11
hw/arm/aspeed: Move AspeedSoCState::cpu/vic to Aspeed2400SoCState (2023-10-25 09:52:44 +0200)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
aspeed queue:
14
aspeed queue:
15
15
16
* New AST1030 SoC and eval board
16
* Update of Andrew's email
17
* Accumulative mode support for HACE controller
17
* Split of AspeedSoCState per 2400/2600/10x0
18
* GPIO fix and unit test
19
* Clock modeling adjustments for the AST2600
20
* Dummy eMMC Boot Controller model
21
* Change of AST2500 EVB and AST2600 EVB flash model (for quad IO)
22
18
23
----------------------------------------------------------------
19
----------------------------------------------------------------
24
Jae Hyun Yoo (1):
20
Andrew Jeffery (1):
25
hw/arm/aspeed: fix AST2500/AST2600 EVB fmc model
21
MAINTAINERS: aspeed: Update Andrew's email address
26
22
27
Jamin Lin (2):
23
Philippe Mathieu-Daudé (11):
28
aspeed: Add an AST1030 eval board
24
hw/arm/aspeed: Extract code common to all boards to a common file
29
test/avocado/machine_aspeed.py: Add ast1030 test case
25
hw/arm/aspeed: Rename aspeed_soc_init() as AST2400/2500 specific
26
hw/arm/aspeed: Rename aspeed_soc_realize() as AST2400/2500 specific
27
hw/arm/aspeed: Dynamically allocate AspeedMachineState::soc field
28
hw/arm/aspeed: Introduce TYPE_ASPEED10X0_SOC
29
hw/arm/aspeed: Introduce TYPE_ASPEED2600_SOC
30
hw/arm/aspeed: Introduce TYPE_ASPEED2400_SOC
31
hw/arm/aspeed: Check 'memory' link is set in common aspeed_soc_realize
32
hw/arm/aspeed: Move AspeedSoCState::armv7m to Aspeed10x0SoCState
33
hw/arm/aspeed: Move AspeedSoCState::a7mpcore to Aspeed2600SoCState
34
hw/arm/aspeed: Move AspeedSoCState::cpu/vic to Aspeed2400SoCState
30
35
31
Joel Stanley (2):
36
MAINTAINERS | 2 +-
32
aspeed: sbc: Correct default reset values
37
include/hw/arm/aspeed_soc.h | 35 +++++-
33
aspeed: Add eMMC Boot Controller stub
38
hw/arm/aspeed.c | 101 +++++++--------
39
hw/arm/aspeed_ast10x0.c | 53 ++++----
40
hw/arm/{aspeed_soc.c => aspeed_ast2400.c} | 197 +++++++-----------------------
41
hw/arm/aspeed_ast2600.c | 75 ++++++------
42
hw/arm/aspeed_soc_common.c | 154 +++++++++++++++++++++++
43
hw/arm/fby35.c | 27 ++--
44
hw/arm/meson.build | 3 +-
45
9 files changed, 363 insertions(+), 284 deletions(-)
46
rename hw/arm/{aspeed_soc.c => aspeed_ast2400.c} (76%)
47
create mode 100644 hw/arm/aspeed_soc_common.c
34
48
35
Peter Delevoryas (1):
36
hw/gpio/aspeed_gpio: Fix QOM pin property
37
38
Steven Lee (13):
39
hw: aspeed_scu: Add AST2600 apb_freq and hpll calculation function
40
hw: aspeed_scu: Introduce clkin_25Mhz attribute
41
aspeed/adc: Add AST1030 support
42
aspeed/smc: Add AST1030 support
43
aspeed/wdt: Fix ast2500/ast2600 default reload value
44
aspeed/wdt: Add AST1030 support
45
aspeed/timer: Add AST1030 support
46
aspeed/scu: Add AST1030 support
47
aspeed/soc : Add AST1030 support
48
aspeed/hace: Support HMAC Key Buffer register.
49
aspeed/hace: Support AST2600 HACE
50
tests/qtest: Add test for Aspeed HACE accumulative mode
51
aspeed/hace: Support AST1030 HACE
52
53
include/hw/adc/aspeed_adc.h | 1 +
54
include/hw/arm/aspeed_soc.h | 4 +
55
include/hw/misc/aspeed_hace.h | 7 +
56
include/hw/misc/aspeed_scu.h | 45 ++++++
57
include/hw/timer/aspeed_timer.h | 1 +
58
include/hw/watchdog/wdt_aspeed.h | 3 +
59
hw/adc/aspeed_adc.c | 16 +++
60
hw/arm/aspeed.c | 70 ++++++++-
61
hw/arm/aspeed_ast10x0.c | 299 +++++++++++++++++++++++++++++++++++++++
62
hw/arm/aspeed_ast2600.c | 6 +
63
hw/gpio/aspeed_gpio.c | 2 +-
64
hw/misc/aspeed_hace.c | 159 ++++++++++++++++++++-
65
hw/misc/aspeed_sbc.c | 7 +-
66
hw/misc/aspeed_scu.c | 108 +++++++++++++-
67
hw/ssi/aspeed_smc.c | 157 ++++++++++++++++++++
68
hw/timer/aspeed_timer.c | 17 +++
69
hw/watchdog/wdt_aspeed.c | 34 ++++-
70
tests/qtest/aspeed_gpio-test.c | 87 ++++++++++++
71
tests/qtest/aspeed_hace-test.c | 147 +++++++++++++++++++
72
hw/arm/meson.build | 6 +-
73
tests/avocado/machine_aspeed.py | 36 +++++
74
tests/qtest/meson.build | 3 +-
75
22 files changed, 1199 insertions(+), 16 deletions(-)
76
create mode 100644 hw/arm/aspeed_ast10x0.c
77
create mode 100644 tests/qtest/aspeed_gpio-test.c
78
create mode 100644 tests/avocado/machine_aspeed.py
diff view generated by jsdifflib
Deleted patch
1
From: Steven Lee <steven_lee@aspeedtech.com>
2
1
3
AST2600's HPLL register offset and bit definition are different from
4
AST2500. Add a hpll calculation function and an apb frequency calculation
5
function based on SCU200 register description in ast2600v11.pdf.
6
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
[ clg: checkpatch fixes ]
10
Message-Id: <20220315075753.8591-2-steven_lee@aspeedtech.com>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
13
include/hw/misc/aspeed_scu.h | 19 ++++++++++++++++++
14
hw/misc/aspeed_scu.c | 39 +++++++++++++++++++++++++++++++++++-
15
2 files changed, 57 insertions(+), 1 deletion(-)
16
17
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
18
index XXXXXXX..XXXXXXX 100644
19
--- a/include/hw/misc/aspeed_scu.h
20
+++ b/include/hw/misc/aspeed_scu.h
21
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUClass {
22
23
const uint32_t *resets;
24
uint32_t (*calc_hpll)(AspeedSCUState *s, uint32_t hpll_reg);
25
+ uint32_t (*get_apb)(AspeedSCUState *s);
26
uint32_t apb_divider;
27
uint32_t nr_regs;
28
const MemoryRegionOps *ops;
29
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
30
SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
31
SCU_AST2500_HW_STRAP_RESERVED1)
32
33
+/*
34
+ * SCU200 H-PLL Parameter Register (for Aspeed AST2600 SOC)
35
+ *
36
+ * 28:26 H-PLL Parameters
37
+ * 25 Enable H-PLL reset
38
+ * 24 Enable H-PLL bypass mode
39
+ * 23 Turn off H-PLL
40
+ * 22:19 H-PLL Post Divider (P)
41
+ * 18:13 H-PLL Numerator (M)
42
+ * 12:0 H-PLL Denumerator (N)
43
+ *
44
+ * (Output frequency) = CLKIN(25MHz) * [(M+1) / (N+1)] / (P+1)
45
+ *
46
+ * The default frequency is 1200Mhz when CLKIN = 25MHz
47
+ */
48
+#define SCU_AST2600_H_PLL_BYPASS_EN (0x1 << 24)
49
+#define SCU_AST2600_H_PLL_OFF (0x1 << 23)
50
+
51
#endif /* ASPEED_SCU_H */
52
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
53
index XXXXXXX..XXXXXXX 100644
54
--- a/hw/misc/aspeed_scu.c
55
+++ b/hw/misc/aspeed_scu.c
56
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_scu_get_random(void)
57
}
58
59
uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s)
60
+{
61
+ return ASPEED_SCU_GET_CLASS(s)->get_apb(s);
62
+}
63
+
64
+static uint32_t aspeed_2400_scu_get_apb_freq(AspeedSCUState *s)
65
{
66
AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
67
uint32_t hpll = asc->calc_hpll(s, s->regs[HPLL_PARAM]);
68
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s)
69
/ asc->apb_divider;
70
}
71
72
+static uint32_t aspeed_2600_scu_get_apb_freq(AspeedSCUState *s)
73
+{
74
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
75
+ uint32_t hpll = asc->calc_hpll(s, s->regs[AST2600_HPLL_PARAM]);
76
+
77
+ return hpll / (SCU_CLK_GET_PCLK_DIV(s->regs[AST2600_CLK_SEL]) + 1)
78
+ / asc->apb_divider;
79
+}
80
+
81
static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
82
{
83
AspeedSCUState *s = ASPEED_SCU(opaque);
84
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2500_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll_reg)
85
return clkin * multiplier;
86
}
87
88
+static uint32_t aspeed_2600_scu_calc_hpll(AspeedSCUState *s, uint32_t hpll_reg)
89
+{
90
+ uint32_t multiplier = 1;
91
+ uint32_t clkin = aspeed_scu_get_clkin(s);
92
+
93
+ if (hpll_reg & SCU_AST2600_H_PLL_OFF) {
94
+ return 0;
95
+ }
96
+
97
+ if (!(hpll_reg & SCU_AST2600_H_PLL_BYPASS_EN)) {
98
+ uint32_t p = (hpll_reg >> 19) & 0xf;
99
+ uint32_t n = (hpll_reg >> 13) & 0x3f;
100
+ uint32_t m = hpll_reg & 0x1fff;
101
+
102
+ multiplier = ((m + 1) / (n + 1)) / (p + 1);
103
+ }
104
+
105
+ return clkin * multiplier;
106
+}
107
+
108
static void aspeed_scu_reset(DeviceState *dev)
109
{
110
AspeedSCUState *s = ASPEED_SCU(dev);
111
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_scu_class_init(ObjectClass *klass, void *data)
112
dc->desc = "ASPEED 2400 System Control Unit";
113
asc->resets = ast2400_a0_resets;
114
asc->calc_hpll = aspeed_2400_scu_calc_hpll;
115
+ asc->get_apb = aspeed_2400_scu_get_apb_freq;
116
asc->apb_divider = 2;
117
asc->nr_regs = ASPEED_SCU_NR_REGS;
118
asc->ops = &aspeed_ast2400_scu_ops;
119
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_scu_class_init(ObjectClass *klass, void *data)
120
dc->desc = "ASPEED 2500 System Control Unit";
121
asc->resets = ast2500_a1_resets;
122
asc->calc_hpll = aspeed_2500_scu_calc_hpll;
123
+ asc->get_apb = aspeed_2400_scu_get_apb_freq;
124
asc->apb_divider = 4;
125
asc->nr_regs = ASPEED_SCU_NR_REGS;
126
asc->ops = &aspeed_ast2500_scu_ops;
127
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_scu_class_init(ObjectClass *klass, void *data)
128
dc->desc = "ASPEED 2600 System Control Unit";
129
dc->reset = aspeed_ast2600_scu_reset;
130
asc->resets = ast2600_a3_resets;
131
- asc->calc_hpll = aspeed_2500_scu_calc_hpll; /* No change since AST2500 */
132
+ asc->calc_hpll = aspeed_2600_scu_calc_hpll;
133
+ asc->get_apb = aspeed_2600_scu_get_apb_freq;
134
asc->apb_divider = 4;
135
asc->nr_regs = ASPEED_AST2600_SCU_NR_REGS;
136
asc->ops = &aspeed_ast2600_scu_ops;
137
--
138
2.35.1
139
140
diff view generated by jsdifflib
Deleted patch
1
From: Steven Lee <steven_lee@aspeedtech.com>
2
1
3
AST2600 clkin is always 25MHz, introduce clkin_25Mhz attribute
4
for aspeed_scu_get_clkin() to return the correct clkin for ast2600.
5
6
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-Id: <20220315075753.8591-3-steven_lee@aspeedtech.com>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
11
include/hw/misc/aspeed_scu.h | 1 +
12
hw/misc/aspeed_scu.c | 6 +++++-
13
2 files changed, 6 insertions(+), 1 deletion(-)
14
15
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/misc/aspeed_scu.h
18
+++ b/include/hw/misc/aspeed_scu.h
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUClass {
20
uint32_t (*get_apb)(AspeedSCUState *s);
21
uint32_t apb_divider;
22
uint32_t nr_regs;
23
+ bool clkin_25Mhz;
24
const MemoryRegionOps *ops;
25
};
26
27
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/misc/aspeed_scu.c
30
+++ b/hw/misc/aspeed_scu.c
31
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_ast2500_scu_ops = {
32
33
static uint32_t aspeed_scu_get_clkin(AspeedSCUState *s)
34
{
35
- if (s->hw_strap1 & SCU_HW_STRAP_CLK_25M_IN) {
36
+ if (s->hw_strap1 & SCU_HW_STRAP_CLK_25M_IN ||
37
+ ASPEED_SCU_GET_CLASS(s)->clkin_25Mhz) {
38
return 25000000;
39
} else if (s->hw_strap1 & SCU_HW_STRAP_CLK_48M_IN) {
40
return 48000000;
41
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_scu_class_init(ObjectClass *klass, void *data)
42
asc->get_apb = aspeed_2400_scu_get_apb_freq;
43
asc->apb_divider = 2;
44
asc->nr_regs = ASPEED_SCU_NR_REGS;
45
+ asc->clkin_25Mhz = false;
46
asc->ops = &aspeed_ast2400_scu_ops;
47
}
48
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_scu_class_init(ObjectClass *klass, void *data)
50
asc->get_apb = aspeed_2400_scu_get_apb_freq;
51
asc->apb_divider = 4;
52
asc->nr_regs = ASPEED_SCU_NR_REGS;
53
+ asc->clkin_25Mhz = false;
54
asc->ops = &aspeed_ast2500_scu_ops;
55
}
56
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_scu_class_init(ObjectClass *klass, void *data)
58
asc->get_apb = aspeed_2600_scu_get_apb_freq;
59
asc->apb_divider = 4;
60
asc->nr_regs = ASPEED_AST2600_SCU_NR_REGS;
61
+ asc->clkin_25Mhz = true;
62
asc->ops = &aspeed_ast2600_scu_ops;
63
}
64
65
--
66
2.35.1
67
68
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
In order to correctly report secure boot running firmware, these values
4
must be set. They are taken from a running machine when secure boot is
5
enabled.
6
7
We don't yet have documentation from ASPEED on what they mean. Set the
8
raw values for now, and in the future improve the model with properties
9
to set these on a per-machine basis.
10
11
Signed-off-by: Joel Stanley <joel@jms.id.au>
12
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
13
Message-Id: <20220310052159.183975-1-joel@jms.id.au>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
16
hw/misc/aspeed_sbc.c | 7 +++++--
17
1 file changed, 5 insertions(+), 2 deletions(-)
18
19
diff --git a/hw/misc/aspeed_sbc.c b/hw/misc/aspeed_sbc.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/misc/aspeed_sbc.c
22
+++ b/hw/misc/aspeed_sbc.c
23
@@ -XXX,XX +XXX,XX @@
24
25
#define R_PROT (0x000 / 4)
26
#define R_STATUS (0x014 / 4)
27
+#define R_QSR (0x040 / 4)
28
29
static uint64_t aspeed_sbc_read(void *opaque, hwaddr addr, unsigned int size)
30
{
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_sbc_write(void *opaque, hwaddr addr, uint64_t data,
32
33
switch (addr) {
34
case R_STATUS:
35
+ case R_QSR:
36
qemu_log_mask(LOG_GUEST_ERROR,
37
"%s: write to read only register 0x%" HWADDR_PRIx "\n",
38
__func__, addr << 2);
39
@@ -XXX,XX +XXX,XX @@ static void aspeed_sbc_reset(DeviceState *dev)
40
41
memset(s->regs, 0, sizeof(s->regs));
42
43
- /* Set secure boot enabled, and boot from emmc/spi */
44
- s->regs[R_STATUS] = 1 << 6 | 1 << 5;
45
+ /* Set secure boot enabled with RSA4096_SHA256 and enable eMMC ABR */
46
+ s->regs[R_STATUS] = 0x000044C6;
47
+ s->regs[R_QSR] = 0x07C07C89;
48
}
49
50
static void aspeed_sbc_realize(DeviceState *dev, Error **errp)
51
--
52
2.35.1
53
54
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Andrew Jeffery <andrew@codeconstruct.com.au>
2
2
3
Per ast1030_v7.pdf, AST1030 HACE engine is identical to AST2600's HACE
3
I've changed employers, have company email that deals with patch-based
4
engine.
4
workflows without too much of a headache, and am trying to steer some
5
content out of my personal mail.
5
6
6
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
7
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
9
---
9
include/hw/misc/aspeed_hace.h | 2 ++
10
MAINTAINERS | 2 +-
10
hw/misc/aspeed_hace.c | 20 ++++++++++++++++++++
11
1 file changed, 1 insertion(+), 1 deletion(-)
11
2 files changed, 22 insertions(+)
12
12
13
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
13
diff --git a/MAINTAINERS b/MAINTAINERS
14
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
15
--- a/include/hw/misc/aspeed_hace.h
15
--- a/MAINTAINERS
16
+++ b/include/hw/misc/aspeed_hace.h
16
+++ b/MAINTAINERS
17
@@ -XXX,XX +XXX,XX @@
17
@@ -XXX,XX +XXX,XX @@ F: docs/system/arm/emcraft-sf2.rst
18
#define TYPE_ASPEED_AST2400_HACE TYPE_ASPEED_HACE "-ast2400"
18
ASPEED BMCs
19
#define TYPE_ASPEED_AST2500_HACE TYPE_ASPEED_HACE "-ast2500"
19
M: Cédric Le Goater <clg@kaod.org>
20
#define TYPE_ASPEED_AST2600_HACE TYPE_ASPEED_HACE "-ast2600"
20
M: Peter Maydell <peter.maydell@linaro.org>
21
+#define TYPE_ASPEED_AST1030_HACE TYPE_ASPEED_HACE "-ast1030"
21
-R: Andrew Jeffery <andrew@aj.id.au>
22
+
22
+R: Andrew Jeffery <andrew@codeconstruct.com.au>
23
OBJECT_DECLARE_TYPE(AspeedHACEState, AspeedHACEClass, ASPEED_HACE)
23
R: Joel Stanley <joel@jms.id.au>
24
24
L: qemu-arm@nongnu.org
25
#define ASPEED_HACE_NR_REGS (0x64 >> 2)
25
S: Maintained
26
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
27
index XXXXXXX..XXXXXXX 100644
28
--- a/hw/misc/aspeed_hace.c
29
+++ b/hw/misc/aspeed_hace.c
30
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_ast2600_hace_info = {
31
.class_init = aspeed_ast2600_hace_class_init,
32
};
33
34
+static void aspeed_ast1030_hace_class_init(ObjectClass *klass, void *data)
35
+{
36
+ DeviceClass *dc = DEVICE_CLASS(klass);
37
+ AspeedHACEClass *ahc = ASPEED_HACE_CLASS(klass);
38
+
39
+ dc->desc = "AST1030 Hash and Crypto Engine";
40
+
41
+ ahc->src_mask = 0x7FFFFFFF;
42
+ ahc->dest_mask = 0x7FFFFFF8;
43
+ ahc->key_mask = 0x7FFFFFF8;
44
+ ahc->hash_mask = 0x00147FFF;
45
+}
46
+
47
+static const TypeInfo aspeed_ast1030_hace_info = {
48
+ .name = TYPE_ASPEED_AST1030_HACE,
49
+ .parent = TYPE_ASPEED_HACE,
50
+ .class_init = aspeed_ast1030_hace_class_init,
51
+};
52
+
53
static void aspeed_hace_register_types(void)
54
{
55
type_register_static(&aspeed_ast2400_hace_info);
56
type_register_static(&aspeed_ast2500_hace_info);
57
type_register_static(&aspeed_ast2600_hace_info);
58
+ type_register_static(&aspeed_ast1030_hace_info);
59
type_register_static(&aspeed_hace_info);
60
}
61
62
--
26
--
63
2.35.1
27
2.41.0
64
28
65
29
diff view generated by jsdifflib
1
From: Peter Delevoryas <pdel@fb.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
I was setting gpioV4-7 to "1110" using the QOM pin property handler and
3
aspeed_soc.c contains definitions specific to the AST2400
4
noticed that lowering gpioV7 was inadvertently lowering gpioV4-6 too.
4
and AST2500 SoCs, but also some definitions for other AST
5
5
SoCs: move them to a common file.
6
(qemu) qom-set /machine/soc/gpio gpioV4 true
6
7
(qemu) qom-set /machine/soc/gpio gpioV5 true
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
(qemu) qom-set /machine/soc/gpio gpioV6 true
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
(qemu) qom-get /machine/soc/gpio gpioV4
10
true
11
(qemu) qom-set /machine/soc/gpio gpioV7 false
12
(qemu) qom-get /machine/soc/gpio gpioV4
13
false
14
15
An expression in aspeed_gpio_set_pin_level was using a logical NOT
16
operator instead of a bitwise NOT operator:
17
18
value &= !pin_mask;
19
20
The original author probably intended to make a bitwise NOT expression
21
"~", but mistakenly used a logical NOT operator "!" instead. Some
22
programming languages like Rust use "!" for both purposes.
23
24
Fixes: 4b7f956862dc ("hw/gpio: Add basic Aspeed GPIO model for AST2400 and
25
AST2500")
26
Signed-off-by: Peter Delevoryas <pdel@fb.com>
27
Message-Id: <20220502080827.244815-1-pdel@fb.com>
28
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
29
---
10
---
30
hw/gpio/aspeed_gpio.c | 2 +-
11
hw/arm/aspeed_soc.c | 96 -------------------------------
31
tests/qtest/aspeed_gpio-test.c | 87 ++++++++++++++++++++++++++++++++++
12
hw/arm/aspeed_soc_common.c | 114 +++++++++++++++++++++++++++++++++++++
32
tests/qtest/meson.build | 3 +-
13
hw/arm/meson.build | 1 +
33
3 files changed, 90 insertions(+), 2 deletions(-)
14
3 files changed, 115 insertions(+), 96 deletions(-)
34
create mode 100644 tests/qtest/aspeed_gpio-test.c
15
create mode 100644 hw/arm/aspeed_soc_common.c
35
16
36
diff --git a/hw/gpio/aspeed_gpio.c b/hw/gpio/aspeed_gpio.c
17
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
37
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
38
--- a/hw/gpio/aspeed_gpio.c
19
--- a/hw/arm/aspeed_soc.c
39
+++ b/hw/gpio/aspeed_gpio.c
20
+++ b/hw/arm/aspeed_soc.c
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_gpio_set_pin_level(AspeedGPIOState *s, uint32_t set_idx,
21
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_register_types(void)
41
if (level) {
22
};
42
value |= pin_mask;
23
43
} else {
24
type_init(aspeed_soc_register_types);
44
- value &= !pin_mask;
25
-
45
+ value &= ~pin_mask;
26
-qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
46
}
27
-{
47
28
- return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
48
aspeed_gpio_update(s, &s->sets[set_idx], value);
29
-}
49
diff --git a/tests/qtest/aspeed_gpio-test.c b/tests/qtest/aspeed_gpio-test.c
30
-
31
-bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
32
-{
33
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
34
- SerialMM *smm;
35
-
36
- for (int i = 0, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
37
- smm = &s->uart[i];
38
-
39
- /* Chardev property is set by the machine. */
40
- qdev_prop_set_uint8(DEVICE(smm), "regshift", 2);
41
- qdev_prop_set_uint32(DEVICE(smm), "baudbase", 38400);
42
- qdev_set_legacy_instance_id(DEVICE(smm), sc->memmap[uart], 2);
43
- qdev_prop_set_uint8(DEVICE(smm), "endianness", DEVICE_LITTLE_ENDIAN);
44
- if (!sysbus_realize(SYS_BUS_DEVICE(smm), errp)) {
45
- return false;
46
- }
47
-
48
- sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, aspeed_soc_get_irq(s, uart));
49
- aspeed_mmio_map(s, SYS_BUS_DEVICE(smm), 0, sc->memmap[uart]);
50
- }
51
-
52
- return true;
53
-}
54
-
55
-void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr)
56
-{
57
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
58
- int i = dev - ASPEED_DEV_UART1;
59
-
60
- g_assert(0 <= i && i < ARRAY_SIZE(s->uart) && i < sc->uarts_num);
61
- qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
62
-}
63
-
64
-/*
65
- * SDMC should be realized first to get correct RAM size and max size
66
- * values
67
- */
68
-bool aspeed_soc_dram_init(AspeedSoCState *s, Error **errp)
69
-{
70
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
71
- ram_addr_t ram_size, max_ram_size;
72
-
73
- ram_size = object_property_get_uint(OBJECT(&s->sdmc), "ram-size",
74
- &error_abort);
75
- max_ram_size = object_property_get_uint(OBJECT(&s->sdmc), "max-ram-size",
76
- &error_abort);
77
-
78
- memory_region_init(&s->dram_container, OBJECT(s), "ram-container",
79
- max_ram_size);
80
- memory_region_add_subregion(&s->dram_container, 0, s->dram_mr);
81
-
82
- /*
83
- * Add a memory region beyond the RAM region to let firmwares scan
84
- * the address space with load/store and guess how much RAM the
85
- * SoC has.
86
- */
87
- if (ram_size < max_ram_size) {
88
- DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
89
-
90
- qdev_prop_set_string(dev, "name", "ram-empty");
91
- qdev_prop_set_uint64(dev, "size", max_ram_size - ram_size);
92
- if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
93
- return false;
94
- }
95
-
96
- memory_region_add_subregion_overlap(&s->dram_container, ram_size,
97
- sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0), -1000);
98
- }
99
-
100
- memory_region_add_subregion(s->memory,
101
- sc->memmap[ASPEED_DEV_SDRAM], &s->dram_container);
102
- return true;
103
-}
104
-
105
-void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr)
106
-{
107
- memory_region_add_subregion(s->memory, addr,
108
- sysbus_mmio_get_region(dev, n));
109
-}
110
-
111
-void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
112
- const char *name, hwaddr addr, uint64_t size)
113
-{
114
- qdev_prop_set_string(DEVICE(dev), "name", name);
115
- qdev_prop_set_uint64(DEVICE(dev), "size", size);
116
- sysbus_realize(dev, &error_abort);
117
-
118
- memory_region_add_subregion_overlap(s->memory, addr,
119
- sysbus_mmio_get_region(dev, 0), -1000);
120
-}
121
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
50
new file mode 100644
122
new file mode 100644
51
index XXXXXXX..XXXXXXX
123
index XXXXXXX..XXXXXXX
52
--- /dev/null
124
--- /dev/null
53
+++ b/tests/qtest/aspeed_gpio-test.c
125
+++ b/hw/arm/aspeed_soc_common.c
54
@@ -XXX,XX +XXX,XX @@
126
@@ -XXX,XX +XXX,XX @@
55
+/*
127
+/*
56
+ * QTest testcase for the Aspeed GPIO Controller.
128
+ * ASPEED SoC family
57
+ *
129
+ *
58
+ * Copyright (c) Meta Platforms, Inc. and affiliates. (http://www.meta.com)
130
+ * Andrew Jeffery <andrew@aj.id.au>
131
+ * Jeremy Kerr <jk@ozlabs.org>
59
+ *
132
+ *
60
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
133
+ * Copyright 2016 IBM Corp.
61
+ * of this software and associated documentation files (the "Software"), to deal
62
+ * in the Software without restriction, including without limitation the rights
63
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
64
+ * copies of the Software, and to permit persons to whom the Software is
65
+ * furnished to do so, subject to the following conditions:
66
+ *
134
+ *
67
+ * The above copyright notice and this permission notice shall be included in
135
+ * This code is licensed under the GPL version 2 or later. See
68
+ * all copies or substantial portions of the Software.
136
+ * the COPYING file in the top-level directory.
69
+ *
70
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
71
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
72
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
73
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
74
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
75
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
76
+ * THE SOFTWARE.
77
+ */
137
+ */
78
+
138
+
79
+#include "qemu/osdep.h"
139
+#include "qemu/osdep.h"
80
+#include "qemu/bitops.h"
140
+#include "qapi/error.h"
81
+#include "qemu/timer.h"
141
+#include "hw/misc/unimp.h"
82
+#include "qapi/qmp/qdict.h"
142
+#include "hw/arm/aspeed_soc.h"
83
+#include "libqtest-single.h"
143
+#include "hw/char/serial.h"
84
+
144
+
85
+static bool qom_get_bool(QTestState *s, const char *path, const char *property)
145
+
86
+{
146
+qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
87
+ QDict *r;
147
+{
88
+ bool b;
148
+ return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
89
+
149
+}
90
+ r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': "
150
+
91
+ "{ 'path': %s, 'property': %s } }", path, property);
151
+bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
92
+ b = qdict_get_bool(r, "return");
152
+{
93
+ qobject_unref(r);
153
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
94
+
154
+ SerialMM *smm;
95
+ return b;
155
+
96
+}
156
+ for (int i = 0, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
97
+
157
+ smm = &s->uart[i];
98
+static void qom_set_bool(QTestState *s, const char *path, const char *property,
158
+
99
+ bool value)
159
+ /* Chardev property is set by the machine. */
100
+{
160
+ qdev_prop_set_uint8(DEVICE(smm), "regshift", 2);
101
+ QDict *r;
161
+ qdev_prop_set_uint32(DEVICE(smm), "baudbase", 38400);
102
+
162
+ qdev_set_legacy_instance_id(DEVICE(smm), sc->memmap[uart], 2);
103
+ r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': "
163
+ qdev_prop_set_uint8(DEVICE(smm), "endianness", DEVICE_LITTLE_ENDIAN);
104
+ "{ 'path': %s, 'property': %s, 'value': %i } }",
164
+ if (!sysbus_realize(SYS_BUS_DEVICE(smm), errp)) {
105
+ path, property, value);
165
+ return false;
106
+ qobject_unref(r);
166
+ }
107
+}
167
+
108
+
168
+ sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, aspeed_soc_get_irq(s, uart));
109
+static void test_set_colocated_pins(const void *data)
169
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(smm), 0, sc->memmap[uart]);
110
+{
170
+ }
111
+ QTestState *s = (QTestState *)data;
171
+
172
+ return true;
173
+}
174
+
175
+void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr)
176
+{
177
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
178
+ int i = dev - ASPEED_DEV_UART1;
179
+
180
+ g_assert(0 <= i && i < ARRAY_SIZE(s->uart) && i < sc->uarts_num);
181
+ qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
182
+}
183
+
184
+/*
185
+ * SDMC should be realized first to get correct RAM size and max size
186
+ * values
187
+ */
188
+bool aspeed_soc_dram_init(AspeedSoCState *s, Error **errp)
189
+{
190
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
191
+ ram_addr_t ram_size, max_ram_size;
192
+
193
+ ram_size = object_property_get_uint(OBJECT(&s->sdmc), "ram-size",
194
+ &error_abort);
195
+ max_ram_size = object_property_get_uint(OBJECT(&s->sdmc), "max-ram-size",
196
+ &error_abort);
197
+
198
+ memory_region_init(&s->dram_container, OBJECT(s), "ram-container",
199
+ max_ram_size);
200
+ memory_region_add_subregion(&s->dram_container, 0, s->dram_mr);
112
+
201
+
113
+ /*
202
+ /*
114
+ * gpioV4-7 occupy bits within a single 32-bit value, so we want to make
203
+ * Add a memory region beyond the RAM region to let firmwares scan
115
+ * sure that modifying one doesn't affect the other.
204
+ * the address space with load/store and guess how much RAM the
205
+ * SoC has.
116
+ */
206
+ */
117
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV4", true);
207
+ if (ram_size < max_ram_size) {
118
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV5", false);
208
+ DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
119
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV6", true);
209
+
120
+ qom_set_bool(s, "/machine/soc/gpio", "gpioV7", false);
210
+ qdev_prop_set_string(dev, "name", "ram-empty");
121
+ g_assert(qom_get_bool(s, "/machine/soc/gpio", "gpioV4"));
211
+ qdev_prop_set_uint64(dev, "size", max_ram_size - ram_size);
122
+ g_assert(!qom_get_bool(s, "/machine/soc/gpio", "gpioV5"));
212
+ if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
123
+ g_assert(qom_get_bool(s, "/machine/soc/gpio", "gpioV6"));
213
+ return false;
124
+ g_assert(!qom_get_bool(s, "/machine/soc/gpio", "gpioV7"));
214
+ }
125
+}
215
+
126
+
216
+ memory_region_add_subregion_overlap(&s->dram_container, ram_size,
127
+int main(int argc, char **argv)
217
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0), -1000);
128
+{
218
+ }
129
+ QTestState *s;
219
+
130
+ int r;
220
+ memory_region_add_subregion(s->memory,
131
+
221
+ sc->memmap[ASPEED_DEV_SDRAM], &s->dram_container);
132
+ g_test_init(&argc, &argv, NULL);
222
+ return true;
133
+
223
+}
134
+ s = qtest_init("-machine ast2600-evb");
224
+
135
+ qtest_add_data_func("/ast2600/gpio/set_colocated_pins", s,
225
+void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr)
136
+ test_set_colocated_pins);
226
+{
137
+ r = g_test_run();
227
+ memory_region_add_subregion(s->memory, addr,
138
+ qtest_quit(s);
228
+ sysbus_mmio_get_region(dev, n));
139
+
229
+}
140
+ return r;
230
+
141
+}
231
+void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
142
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
232
+ const char *name, hwaddr addr, uint64_t size)
233
+{
234
+ qdev_prop_set_string(DEVICE(dev), "name", name);
235
+ qdev_prop_set_uint64(DEVICE(dev), "size", size);
236
+ sysbus_realize(dev, &error_abort);
237
+
238
+ memory_region_add_subregion_overlap(s->memory, addr,
239
+ sysbus_mmio_get_region(dev, 0), -1000);
240
+}
241
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
143
index XXXXXXX..XXXXXXX 100644
242
index XXXXXXX..XXXXXXX 100644
144
--- a/tests/qtest/meson.build
243
--- a/hw/arm/meson.build
145
+++ b/tests/qtest/meson.build
244
+++ b/hw/arm/meson.build
146
@@ -XXX,XX +XXX,XX @@ qtests_npcm7xx = \
245
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
147
(slirp.found() ? ['npcm7xx_emc-test'] : [])
246
arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
148
qtests_aspeed = \
247
'aspeed_soc.c',
149
['aspeed_hace-test',
248
'aspeed.c',
150
- 'aspeed_smc-test']
249
+ 'aspeed_soc_common.c',
151
+ 'aspeed_smc-test',
250
'aspeed_ast2600.c',
152
+ 'aspeed_gpio-test']
251
'aspeed_ast10x0.c',
153
qtests_arm = \
252
'aspeed_eeprom.c',
154
(config_all_devices.has_key('CONFIG_MPS2') ? ['sse-timer-test'] : []) + \
155
(config_all_devices.has_key('CONFIG_CMSDK_APB_DUALTIMER') ? ['cmsdk-apb-dualtimer-test'] : []) + \
156
--
253
--
157
2.35.1
254
2.41.0
158
255
159
256
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The aspeed ast2600 accumulative mode is described in datasheet
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
ast2600v10.pdf section 25.6.4:
5
1. Allocating and initiating accumulative hash digest write buffer
6
with initial state.
7
* Since QEMU crypto/hash api doesn't provide the API to set initial
8
state of hash library, and the initial state is already set by
9
crypto library (gcrypt/glib/...), so skip this step.
10
2. Calculating accumulative hash digest.
11
(a) When receiving the last accumulative data, software need to add
12
padding message at the end of the accumulative data. Padding
13
message described in specific of MD5, SHA-1, SHA224, SHA256,
14
SHA512, SHA512/224, SHA512/256.
15
* Since the crypto library (gcrypt/glib) already pad the
16
padding message internally.
17
* This patch is to remove the padding message which fed byguest
18
machine driver.
19
20
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
21
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
22
Reviewed-by: Cédric Le Goater <clg@kaod.org>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
23
Message-Id: <20220426021120.28255-3-steven_lee@aspeedtech.com>
24
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
25
---
6
---
26
include/hw/misc/aspeed_hace.h | 4 ++
7
hw/arm/aspeed_soc.c | 6 +++---
27
hw/misc/aspeed_hace.c | 132 ++++++++++++++++++++++++++++++++--
8
1 file changed, 3 insertions(+), 3 deletions(-)
28
2 files changed, 131 insertions(+), 5 deletions(-)
29
9
30
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
10
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
31
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
32
--- a/include/hw/misc/aspeed_hace.h
12
--- a/hw/arm/aspeed_soc.c
33
+++ b/include/hw/misc/aspeed_hace.h
13
+++ b/hw/arm/aspeed_soc.c
34
@@ -XXX,XX +XXX,XX @@
14
@@ -XXX,XX +XXX,XX @@ static qemu_irq aspeed_soc_ast2400_get_irq(AspeedSoCState *s, int dev)
35
OBJECT_DECLARE_TYPE(AspeedHACEState, AspeedHACEClass, ASPEED_HACE)
15
return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[dev]);
36
37
#define ASPEED_HACE_NR_REGS (0x64 >> 2)
38
+#define ASPEED_HACE_MAX_SG 256 /* max number of entries */
39
40
struct AspeedHACEState {
41
SysBusDevice parent;
42
@@ -XXX,XX +XXX,XX @@ struct AspeedHACEState {
43
MemoryRegion iomem;
44
qemu_irq irq;
45
46
+ struct iovec iov_cache[ASPEED_HACE_MAX_SG];
47
uint32_t regs[ASPEED_HACE_NR_REGS];
48
+ uint32_t total_req_len;
49
+ uint32_t iov_count;
50
51
MemoryRegion *dram_mr;
52
AddressSpace dram_as;
53
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
54
index XXXXXXX..XXXXXXX 100644
55
--- a/hw/misc/aspeed_hace.c
56
+++ b/hw/misc/aspeed_hace.c
57
@@ -XXX,XX +XXX,XX @@
58
#define SG_LIST_ADDR_SIZE 4
59
#define SG_LIST_ADDR_MASK 0x7FFFFFFF
60
#define SG_LIST_ENTRY_SIZE (SG_LIST_LEN_SIZE + SG_LIST_ADDR_SIZE)
61
-#define ASPEED_HACE_MAX_SG 256 /* max number of entries */
62
63
static const struct {
64
uint32_t mask;
65
@@ -XXX,XX +XXX,XX @@ static int hash_algo_lookup(uint32_t reg)
66
return -1;
67
}
16
}
68
17
69
-static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
18
-static void aspeed_soc_init(Object *obj)
70
+/**
19
+static void aspeed_ast2400_soc_init(Object *obj)
71
+ * Check whether the request contains padding message.
72
+ *
73
+ * @param s aspeed hace state object
74
+ * @param iov iov of current request
75
+ * @param req_len length of the current request
76
+ * @param total_msg_len length of all acc_mode requests(excluding padding msg)
77
+ * @param pad_offset start offset of padding message
78
+ */
79
+static bool has_padding(AspeedHACEState *s, struct iovec *iov,
80
+ hwaddr req_len, uint32_t *total_msg_len,
81
+ uint32_t *pad_offset)
82
+{
83
+ *total_msg_len = (uint32_t)(ldq_be_p(iov->iov_base + req_len - 8) / 8);
84
+ /*
85
+ * SG_LIST_LEN_LAST asserted in the request length doesn't mean it is the
86
+ * last request. The last request should contain padding message.
87
+ * We check whether message contains padding by
88
+ * 1. Get total message length. If the current message contains
89
+ * padding, the last 8 bytes are total message length.
90
+ * 2. Check whether the total message length is valid.
91
+ * If it is valid, the value should less than or equal to
92
+ * total_req_len.
93
+ * 3. Current request len - padding_size to get padding offset.
94
+ * The padding message's first byte should be 0x80
95
+ */
96
+ if (*total_msg_len <= s->total_req_len) {
97
+ uint32_t padding_size = s->total_req_len - *total_msg_len;
98
+ uint8_t *padding = iov->iov_base;
99
+ *pad_offset = req_len - padding_size;
100
+ if (padding[*pad_offset] == 0x80) {
101
+ return true;
102
+ }
103
+ }
104
+
105
+ return false;
106
+}
107
+
108
+static int reconstruct_iov(AspeedHACEState *s, struct iovec *iov, int id,
109
+ uint32_t *pad_offset)
110
+{
111
+ int i, iov_count;
112
+ if (*pad_offset != 0) {
113
+ s->iov_cache[s->iov_count].iov_base = iov[id].iov_base;
114
+ s->iov_cache[s->iov_count].iov_len = *pad_offset;
115
+ ++s->iov_count;
116
+ }
117
+ for (i = 0; i < s->iov_count; i++) {
118
+ iov[i].iov_base = s->iov_cache[i].iov_base;
119
+ iov[i].iov_len = s->iov_cache[i].iov_len;
120
+ }
121
+ iov_count = s->iov_count;
122
+ s->iov_count = 0;
123
+ s->total_req_len = 0;
124
+ return iov_count;
125
+}
126
+
127
+/**
128
+ * Generate iov for accumulative mode.
129
+ *
130
+ * @param s aspeed hace state object
131
+ * @param iov iov of the current request
132
+ * @param id index of the current iov
133
+ * @param req_len length of the current request
134
+ *
135
+ * @return count of iov
136
+ */
137
+static int gen_acc_mode_iov(AspeedHACEState *s, struct iovec *iov, int id,
138
+ hwaddr *req_len)
139
+{
140
+ uint32_t pad_offset;
141
+ uint32_t total_msg_len;
142
+ s->total_req_len += *req_len;
143
+
144
+ if (has_padding(s, &iov[id], *req_len, &total_msg_len, &pad_offset)) {
145
+ if (s->iov_count) {
146
+ return reconstruct_iov(s, iov, id, &pad_offset);
147
+ }
148
+
149
+ *req_len -= s->total_req_len - total_msg_len;
150
+ s->total_req_len = 0;
151
+ iov[id].iov_len = *req_len;
152
+ } else {
153
+ s->iov_cache[s->iov_count].iov_base = iov->iov_base;
154
+ s->iov_cache[s->iov_count].iov_len = *req_len;
155
+ ++s->iov_count;
156
+ }
157
+
158
+ return id + 1;
159
+}
160
+
161
+static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode,
162
+ bool acc_mode)
163
{
20
{
164
struct iovec iov[ASPEED_HACE_MAX_SG];
21
AspeedSoCState *s = ASPEED_SOC(obj);
165
g_autofree uint8_t *digest_buf;
22
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
166
size_t digest_len = 0;
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
167
+ int niov = 0;
24
static const TypeInfo aspeed_soc_ast2400_type_info = {
168
int i;
25
.name = "ast2400-a1",
169
26
.parent = TYPE_ASPEED_SOC,
170
if (sg_mode) {
27
- .instance_init = aspeed_soc_init,
171
@@ -XXX,XX +XXX,XX @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
28
+ .instance_init = aspeed_ast2400_soc_init,
172
MEMTXATTRS_UNSPECIFIED, NULL);
29
.instance_size = sizeof(AspeedSoCState),
173
addr &= SG_LIST_ADDR_MASK;
30
.class_init = aspeed_soc_ast2400_class_init,
174
31
};
175
- iov[i].iov_len = len & SG_LIST_LEN_MASK;
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
176
- plen = iov[i].iov_len;
33
static const TypeInfo aspeed_soc_ast2500_type_info = {
177
+ plen = len & SG_LIST_LEN_MASK;
34
.name = "ast2500-a1",
178
iov[i].iov_base = address_space_map(&s->dram_as, addr, &plen, false,
35
.parent = TYPE_ASPEED_SOC,
179
MEMTXATTRS_UNSPECIFIED);
36
- .instance_init = aspeed_soc_init,
180
+
37
+ .instance_init = aspeed_ast2400_soc_init,
181
+ if (acc_mode) {
38
.instance_size = sizeof(AspeedSoCState),
182
+ niov = gen_acc_mode_iov(s, iov, i, &plen);
39
.class_init = aspeed_soc_ast2500_class_init,
183
+
184
+ } else {
185
+ iov[i].iov_len = plen;
186
+ }
187
}
188
} else {
189
hwaddr len = s->regs[R_HASH_SRC_LEN];
190
@@ -XXX,XX +XXX,XX @@ static void do_hash_operation(AspeedHACEState *s, int algo, bool sg_mode)
191
&len, false,
192
MEMTXATTRS_UNSPECIFIED);
193
i = 1;
194
+
195
+ if (s->iov_count) {
196
+ /*
197
+ * In aspeed sdk kernel driver, sg_mode is disabled in hash_final().
198
+ * Thus if we received a request with sg_mode disabled, it is
199
+ * required to check whether cache is empty. If no, we should
200
+ * combine cached iov and the current iov.
201
+ */
202
+ uint32_t total_msg_len;
203
+ uint32_t pad_offset;
204
+ s->total_req_len += len;
205
+ if (has_padding(s, iov, len, &total_msg_len, &pad_offset)) {
206
+ niov = reconstruct_iov(s, iov, 0, &pad_offset);
207
+ }
208
+ }
209
+ }
210
+
211
+ if (niov) {
212
+ i = niov;
213
}
214
215
if (qcrypto_hash_bytesv(algo, iov, i, &digest_buf, &digest_len, NULL) < 0) {
216
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_write(void *opaque, hwaddr addr, uint64_t data,
217
__func__, data & ahc->hash_mask);
218
break;
219
}
220
- do_hash_operation(s, algo, data & HASH_SG_EN);
221
+ do_hash_operation(s, algo, data & HASH_SG_EN,
222
+ ((data & HASH_HMAC_MASK) == HASH_DIGEST_ACCUM));
223
224
if (data & HASH_IRQ_EN) {
225
qemu_irq_raise(s->irq);
226
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_reset(DeviceState *dev)
227
struct AspeedHACEState *s = ASPEED_HACE(dev);
228
229
memset(s->regs, 0, sizeof(s->regs));
230
+ s->iov_count = 0;
231
+ s->total_req_len = 0;
232
}
233
234
static void aspeed_hace_realize(DeviceState *dev, Error **errp)
235
@@ -XXX,XX +XXX,XX @@ static const VMStateDescription vmstate_aspeed_hace = {
236
.minimum_version_id = 1,
237
.fields = (VMStateField[]) {
238
VMSTATE_UINT32_ARRAY(regs, AspeedHACEState, ASPEED_HACE_NR_REGS),
239
+ VMSTATE_UINT32(total_req_len, AspeedHACEState),
240
+ VMSTATE_UINT32(iov_count, AspeedHACEState),
241
VMSTATE_END_OF_LIST(),
242
}
243
};
40
};
244
--
41
--
245
2.35.1
42
2.41.0
246
43
247
44
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Support HACE28: Hash HMAC Key Buffer Base Address Register.
3
Keep aspeed_soc_class_init() generic, set the realize handler
4
to aspeed_ast2400_soc_realize() in each 2400/2500 class_init.
4
5
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Message-Id: <20220426021120.28255-2-steven_lee@aspeedtech.com>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
9
---
11
include/hw/misc/aspeed_hace.h | 1 +
10
hw/arm/aspeed_soc.c | 15 +++++++++++----
12
hw/misc/aspeed_hace.c | 7 +++++++
11
1 file changed, 11 insertions(+), 4 deletions(-)
13
2 files changed, 8 insertions(+)
14
12
15
diff --git a/include/hw/misc/aspeed_hace.h b/include/hw/misc/aspeed_hace.h
13
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/misc/aspeed_hace.h
15
--- a/hw/arm/aspeed_soc.c
18
+++ b/include/hw/misc/aspeed_hace.h
16
+++ b/hw/arm/aspeed_soc.c
19
@@ -XXX,XX +XXX,XX @@ struct AspeedHACEClass {
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
20
18
object_initialize_child(obj, "video", &s->video, TYPE_UNIMPLEMENTED_DEVICE);
21
uint32_t src_mask;
22
uint32_t dest_mask;
23
+ uint32_t key_mask;
24
uint32_t hash_mask;
25
};
26
27
diff --git a/hw/misc/aspeed_hace.c b/hw/misc/aspeed_hace.c
28
index XXXXXXX..XXXXXXX 100644
29
--- a/hw/misc/aspeed_hace.c
30
+++ b/hw/misc/aspeed_hace.c
31
@@ -XXX,XX +XXX,XX @@
32
33
#define R_HASH_SRC (0x20 / 4)
34
#define R_HASH_DEST (0x24 / 4)
35
+#define R_HASH_KEY_BUFF (0x28 / 4)
36
#define R_HASH_SRC_LEN (0x2c / 4)
37
38
#define R_HASH_CMD (0x30 / 4)
39
@@ -XXX,XX +XXX,XX @@ static void aspeed_hace_write(void *opaque, hwaddr addr, uint64_t data,
40
case R_HASH_DEST:
41
data &= ahc->dest_mask;
42
break;
43
+ case R_HASH_KEY_BUFF:
44
+ data &= ahc->key_mask;
45
+ break;
46
case R_HASH_SRC_LEN:
47
data &= 0x0FFFFFFF;
48
break;
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_hace_class_init(ObjectClass *klass, void *data)
50
51
ahc->src_mask = 0x0FFFFFFF;
52
ahc->dest_mask = 0x0FFFFFF8;
53
+ ahc->key_mask = 0x0FFFFFC0;
54
ahc->hash_mask = 0x000003ff; /* No SG or SHA512 modes */
55
}
19
}
56
20
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2500_hace_class_init(ObjectClass *klass, void *data)
21
-static void aspeed_soc_realize(DeviceState *dev, Error **errp)
58
22
+static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
59
ahc->src_mask = 0x3fffffff;
23
{
60
ahc->dest_mask = 0x3ffffff8;
24
int i;
61
+ ahc->key_mask = 0x3FFFFFC0;
25
AspeedSoCState *s = ASPEED_SOC(dev);
62
ahc->hash_mask = 0x000003ff; /* No SG or SHA512 modes */
26
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
27
{
28
DeviceClass *dc = DEVICE_CLASS(oc);
29
30
- dc->realize = aspeed_soc_realize;
31
- /* Reason: Uses serial_hds and nd_table in realize() directly */
32
- dc->user_creatable = false;
33
device_class_set_props(dc, aspeed_soc_properties);
63
}
34
}
64
35
65
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2600_hace_class_init(ObjectClass *klass, void *data)
36
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_soc_type_info = {
66
37
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
67
ahc->src_mask = 0x7FFFFFFF;
38
{
68
ahc->dest_mask = 0x7FFFFFF8;
39
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
69
+ ahc->key_mask = 0x7FFFFFF8;
40
+ DeviceClass *dc = DEVICE_CLASS(oc);
70
ahc->hash_mask = 0x00147FFF;
41
+
71
}
42
+ dc->realize = aspeed_ast2400_soc_realize;
72
43
+ /* Reason: Uses serial_hds and nd_table in realize() directly */
44
+ dc->user_creatable = false;
45
46
sc->name = "ast2400-a1";
47
sc->cpu_type = ARM_CPU_TYPE_NAME("arm926");
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_soc_ast2400_type_info = {
49
static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
50
{
51
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
52
+ DeviceClass *dc = DEVICE_CLASS(oc);
53
+
54
+ dc->realize = aspeed_ast2400_soc_realize;
55
+ /* Reason: Uses serial_hds and nd_table in realize() directly */
56
+ dc->user_creatable = false;
57
58
sc->name = "ast2500-a1";
59
sc->cpu_type = ARM_CPU_TYPE_NAME("arm1176");
73
--
60
--
74
2.35.1
61
2.41.0
75
62
76
63
diff view generated by jsdifflib
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The image should be supplied with ELF binary.
3
We want to derivate the big AspeedSoCState object in some more
4
$ qemu-system-arm -M ast1030-evb -kernel zephyr.elf -nographic
4
SoC-specific ones. Since the object size will vary, allocate it
5
5
dynamically.
6
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
7
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
9
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
Message-Id: <20220401083850.15266-9-jamin_lin@aspeedtech.com>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
10
---
13
hw/arm/aspeed.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++
11
hw/arm/aspeed.c | 101 +++++++++++++++++++++++++-----------------------
14
1 file changed, 66 insertions(+)
12
1 file changed, 52 insertions(+), 49 deletions(-)
15
13
16
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
14
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
17
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/arm/aspeed.c
16
--- a/hw/arm/aspeed.c
19
+++ b/hw/arm/aspeed.c
17
+++ b/hw/arm/aspeed.c
20
@@ -XXX,XX +XXX,XX @@
18
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
21
#include "hw/loader.h"
19
MachineState parent_obj;
22
#include "qemu/error-report.h"
20
/* Public */
23
#include "qemu/units.h"
21
24
+#include "hw/qdev-clock.h"
22
- AspeedSoCState soc;
25
23
+ AspeedSoCState *soc;
26
static struct arm_boot_info aspeed_board_binfo = {
24
MemoryRegion boot_rom;
27
.board_id = -1, /* device-tree-only board */
25
bool mmio_exec;
26
uint32_t uart_chosen;
27
@@ -XXX,XX +XXX,XX @@ static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
28
static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
29
uint64_t rom_size)
30
{
31
- AspeedSoCState *soc = &bmc->soc;
32
+ AspeedSoCState *soc = bmc->soc;
33
34
memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
35
&error_abort);
36
@@ -XXX,XX +XXX,XX @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
37
static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
38
{
39
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
40
- AspeedSoCState *s = &bmc->soc;
41
+ AspeedSoCState *s = bmc->soc;
42
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
43
int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
44
45
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
46
int i;
47
NICInfo *nd = &nd_table[0];
48
49
- object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
50
-
51
- sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
52
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
53
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
54
+ object_unref(OBJECT(bmc->soc));
55
+ sc = ASPEED_SOC_GET_CLASS(bmc->soc);
56
57
/*
58
* This will error out if the RAM size is not supported by the
59
* memory controller of the SoC.
60
*/
61
- object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
62
+ object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
63
&error_fatal);
64
65
for (i = 0; i < sc->macs_num; i++) {
66
if ((amc->macs_mask & (1 << i)) && nd->used) {
67
qemu_check_nic_model(nd, TYPE_FTGMAC100);
68
- qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
69
+ qdev_set_nic_properties(DEVICE(&bmc->soc->ftgmac100[i]), nd);
70
nd++;
71
}
72
}
73
74
- object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
75
+ object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
76
&error_abort);
77
- object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
78
+ object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
79
&error_abort);
80
- object_property_set_link(OBJECT(&bmc->soc), "memory",
81
+ object_property_set_link(OBJECT(bmc->soc), "memory",
82
OBJECT(get_system_memory()), &error_abort);
83
- object_property_set_link(OBJECT(&bmc->soc), "dram",
84
+ object_property_set_link(OBJECT(bmc->soc), "dram",
85
OBJECT(machine->ram), &error_abort);
86
if (machine->kernel_filename) {
87
/*
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
89
* that runs to unlock the SCU. In this case set the default to
90
* be unlocked as the kernel expects
91
*/
92
- object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
93
+ object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
94
ASPEED_SCU_PROT_KEY, &error_abort);
95
}
96
connect_serial_hds_to_uarts(bmc);
97
- qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
98
+ qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
99
100
if (defaults_enabled()) {
101
- aspeed_board_init_flashes(&bmc->soc.fmc,
102
+ aspeed_board_init_flashes(&bmc->soc->fmc,
103
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
104
amc->num_cs, 0);
105
- aspeed_board_init_flashes(&bmc->soc.spi[0],
106
+ aspeed_board_init_flashes(&bmc->soc->spi[0],
107
bmc->spi_model ? bmc->spi_model : amc->spi_model,
108
1, amc->num_cs);
109
}
110
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
111
amc->i2c_init(bmc);
112
}
113
114
- for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
115
- sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
116
+ for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
117
+ sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
118
drive_get(IF_SD, 0, i));
119
}
120
121
- if (bmc->soc.emmc.num_slots) {
122
- sdhci_attach_drive(&bmc->soc.emmc.slots[0],
123
- drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
124
+ if (bmc->soc->emmc.num_slots) {
125
+ sdhci_attach_drive(&bmc->soc->emmc.slots[0],
126
+ drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots));
127
}
128
129
if (!bmc->mmio_exec) {
130
- DeviceState *dev = ssi_get_cs(bmc->soc.fmc.spi, 0);
131
+ DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
132
BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
133
134
if (fmc0) {
135
- uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
136
+ uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
137
aspeed_install_boot_rom(bmc, fmc0, rom_size);
138
}
139
}
140
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
141
142
static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
143
{
144
- AspeedSoCState *soc = &bmc->soc;
145
+ AspeedSoCState *soc = bmc->soc;
146
DeviceState *dev;
147
uint8_t *eeprom_buf = g_malloc0(32 * 1024);
148
149
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
150
151
static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
152
{
153
- AspeedSoCState *soc = &bmc->soc;
154
+ AspeedSoCState *soc = bmc->soc;
155
156
/*
157
* The quanta-q71l platform expects tmp75s which are compatible with
158
@@ -XXX,XX +XXX,XX @@ static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
159
160
static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
161
{
162
- AspeedSoCState *soc = &bmc->soc;
163
+ AspeedSoCState *soc = bmc->soc;
164
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
165
166
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
167
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
168
169
static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
170
{
171
- AspeedSoCState *soc = &bmc->soc;
172
+ AspeedSoCState *soc = bmc->soc;
173
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
174
175
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
176
@@ -XXX,XX +XXX,XX @@ static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
177
178
static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
179
{
180
- AspeedSoCState *soc = &bmc->soc;
181
+ AspeedSoCState *soc = bmc->soc;
182
183
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
184
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
185
@@ -XXX,XX +XXX,XX @@ static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
186
187
static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
188
{
189
- AspeedSoCState *soc = &bmc->soc;
190
+ AspeedSoCState *soc = bmc->soc;
191
192
/* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
193
* good enough */
194
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
195
196
static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
197
{
198
- AspeedSoCState *soc = &bmc->soc;
199
+ AspeedSoCState *soc = bmc->soc;
200
201
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
202
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 6), 0x54, 128 * KiB,
203
@@ -XXX,XX +XXX,XX @@ static void create_pca9552(AspeedSoCState *soc, int bus_id, int addr)
204
205
static void sonorapass_bmc_i2c_init(AspeedMachineState *bmc)
206
{
207
- AspeedSoCState *soc = &bmc->soc;
208
+ AspeedSoCState *soc = bmc->soc;
209
210
/* bus 2 : */
211
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 2), "tmp105", 0x48);
212
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
213
{14, LED_COLOR_GREEN, "front-power-3", GPIO_POLARITY_ACTIVE_LOW},
214
{15, LED_COLOR_GREEN, "front-id-5", GPIO_POLARITY_ACTIVE_LOW},
215
};
216
- AspeedSoCState *soc = &bmc->soc;
217
+ AspeedSoCState *soc = bmc->soc;
218
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
219
DeviceState *dev;
220
LEDState *led;
221
@@ -XXX,XX +XXX,XX @@ static void witherspoon_bmc_i2c_init(AspeedMachineState *bmc)
222
223
static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
224
{
225
- AspeedSoCState *soc = &bmc->soc;
226
+ AspeedSoCState *soc = bmc->soc;
227
DeviceState *dev;
228
229
dev = DEVICE(i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 3),
230
@@ -XXX,XX +XXX,XX @@ static void g220a_bmc_i2c_init(AspeedMachineState *bmc)
231
232
static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
233
{
234
- AspeedSoCState *soc = &bmc->soc;
235
+ AspeedSoCState *soc = bmc->soc;
236
I2CSlave *i2c_mux;
237
238
/* The at24c256 */
239
@@ -XXX,XX +XXX,XX @@ static void fp5280g2_bmc_i2c_init(AspeedMachineState *bmc)
240
241
static void rainier_bmc_i2c_init(AspeedMachineState *bmc)
242
{
243
- AspeedSoCState *soc = &bmc->soc;
244
+ AspeedSoCState *soc = bmc->soc;
245
I2CSlave *i2c_mux;
246
247
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 0), 0x51, 32 * KiB);
248
@@ -XXX,XX +XXX,XX @@ static void get_pca9548_channels(I2CBus *bus, uint8_t mux_addr,
249
250
static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
251
{
252
- AspeedSoCState *soc = &bmc->soc;
253
+ AspeedSoCState *soc = bmc->soc;
254
I2CBus *i2c[144] = {};
255
256
for (int i = 0; i < 16; i++) {
257
@@ -XXX,XX +XXX,XX @@ static void fuji_bmc_i2c_init(AspeedMachineState *bmc)
258
259
static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
260
{
261
- AspeedSoCState *soc = &bmc->soc;
262
+ AspeedSoCState *soc = bmc->soc;
263
I2CBus *i2c[13] = {};
264
for (int i = 0; i < 13; i++) {
265
if ((i == 8) || (i == 11)) {
266
@@ -XXX,XX +XXX,XX @@ static void bletchley_bmc_i2c_init(AspeedMachineState *bmc)
267
268
static void fby35_i2c_init(AspeedMachineState *bmc)
269
{
270
- AspeedSoCState *soc = &bmc->soc;
271
+ AspeedSoCState *soc = bmc->soc;
272
I2CBus *i2c[16];
273
274
for (int i = 0; i < 16; i++) {
275
@@ -XXX,XX +XXX,XX @@ static void fby35_i2c_init(AspeedMachineState *bmc)
276
277
static void qcom_dc_scm_bmc_i2c_init(AspeedMachineState *bmc)
278
{
279
- AspeedSoCState *soc = &bmc->soc;
280
+ AspeedSoCState *soc = bmc->soc;
281
282
i2c_slave_create_simple(aspeed_i2c_get_bus(&soc->i2c, 15), "tmp105", 0x4d);
283
}
284
285
static void qcom_dc_scm_firework_i2c_init(AspeedMachineState *bmc)
286
{
287
- AspeedSoCState *soc = &bmc->soc;
288
+ AspeedSoCState *soc = bmc->soc;
289
I2CSlave *therm_mux, *cpuvr_mux;
290
291
/* Create the generic DC-SCM hardware */
28
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
292
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
29
aspeed_soc_num_cpus(amc->soc_name);
293
static void fby35_reset(MachineState *state, ShutdownCause reason)
30
}
294
{
31
295
AspeedMachineState *bmc = ASPEED_MACHINE(state);
32
+#define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
296
- AspeedGPIOState *gpio = &bmc->soc.gpio;
33
+/* Main SYSCLK frequency in Hz (200MHz) */
297
+ AspeedGPIOState *gpio = &bmc->soc->gpio;
34
+#define SYSCLK_FRQ 200000000ULL
298
35
+
299
qemu_devices_reset(reason);
36
+static void aspeed_minibmc_machine_init(MachineState *machine)
300
37
+{
301
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
38
+ AspeedMachineState *bmc = ASPEED_MACHINE(machine);
302
sysclk = clock_new(OBJECT(machine), "SYSCLK");
39
+ AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(machine);
303
clock_set_hz(sysclk, SYSCLK_FRQ);
40
+ Clock *sysclk;
304
41
+
305
- object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
42
+ sysclk = clock_new(OBJECT(machine), "SYSCLK");
306
- qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
43
+ clock_set_hz(sysclk, SYSCLK_FRQ);
307
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
44
+
308
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
45
+ object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
309
+ object_unref(OBJECT(bmc->soc));
46
+ qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
310
+ qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
47
+
311
48
+ qdev_prop_set_uint32(DEVICE(&bmc->soc), "uart-default",
312
- object_property_set_link(OBJECT(&bmc->soc), "memory",
49
+ amc->uart_default);
313
+ object_property_set_link(OBJECT(bmc->soc), "memory",
50
+ qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
314
OBJECT(get_system_memory()), &error_abort);
51
+
315
connect_serial_hds_to_uarts(bmc);
52
+ aspeed_board_init_flashes(&bmc->soc.fmc,
316
- qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
53
+ bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
317
+ qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
54
+ amc->num_cs,
318
55
+ 0);
319
- aspeed_board_init_flashes(&bmc->soc.fmc,
56
+
320
+ aspeed_board_init_flashes(&bmc->soc->fmc,
57
+ aspeed_board_init_flashes(&bmc->soc.spi[0],
321
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
58
+ bmc->spi_model ? bmc->spi_model : amc->spi_model,
322
amc->num_cs,
59
+ amc->num_cs, amc->num_cs);
323
0);
60
+
324
61
+ aspeed_board_init_flashes(&bmc->soc.spi[1],
325
- aspeed_board_init_flashes(&bmc->soc.spi[0],
62
+ bmc->spi_model ? bmc->spi_model : amc->spi_model,
326
+ aspeed_board_init_flashes(&bmc->soc->spi[0],
63
+ amc->num_cs, (amc->num_cs * 2));
327
bmc->spi_model ? bmc->spi_model : amc->spi_model,
64
+
328
amc->num_cs, amc->num_cs);
65
+ if (amc->i2c_init) {
329
66
+ amc->i2c_init(bmc);
330
- aspeed_board_init_flashes(&bmc->soc.spi[1],
67
+ }
331
+ aspeed_board_init_flashes(&bmc->soc->spi[1],
68
+
332
bmc->spi_model ? bmc->spi_model : amc->spi_model,
69
+ armv7m_load_kernel(ARM_CPU(first_cpu),
333
amc->num_cs, (amc->num_cs * 2));
70
+ machine->kernel_filename,
334
71
+ AST1030_INTERNAL_FLASH_SIZE);
335
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
72
+}
336
73
+
337
static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
74
+static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
338
{
75
+ void *data)
339
- AspeedSoCState *soc = &bmc->soc;
76
+{
340
+ AspeedSoCState *soc = bmc->soc;
77
+ MachineClass *mc = MACHINE_CLASS(oc);
341
78
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
342
/* U10 24C08 connects to SDA/SCL Group 1 by default */
79
+
343
uint8_t *eeprom_buf = g_malloc0(32 * 1024);
80
+ mc->desc = "Aspeed AST1030 MiniBMC (Cortex-M4)";
81
+ amc->soc_name = "ast1030-a1";
82
+ amc->hw_strap1 = 0;
83
+ amc->hw_strap2 = 0;
84
+ mc->init = aspeed_minibmc_machine_init;
85
+ mc->default_ram_size = 0;
86
+ mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
87
+ amc->fmc_model = "sst25vf032b";
88
+ amc->spi_model = "sst25vf032b";
89
+ amc->num_cs = 2;
90
+ amc->macs_mask = 0;
91
+}
92
+
93
static const TypeInfo aspeed_machine_types[] = {
94
{
95
.name = MACHINE_TYPE_NAME("palmetto-bmc"),
96
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
97
.name = MACHINE_TYPE_NAME("bletchley-bmc"),
98
.parent = TYPE_ASPEED_MACHINE,
99
.class_init = aspeed_machine_bletchley_class_init,
100
+ }, {
101
+ .name = MACHINE_TYPE_NAME("ast1030-evb"),
102
+ .parent = TYPE_ASPEED_MACHINE,
103
+ .class_init = aspeed_minibmc_machine_ast1030_evb_class_init,
104
}, {
105
.name = TYPE_ASPEED_MACHINE,
106
.parent = TYPE_MACHINE,
107
--
344
--
108
2.35.1
345
2.41.0
109
346
110
347
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Per ast1030_v07.pdf, AST1030 SOC doesn't have SCU300, the pclk divider
3
TYPE_ASPEED10X0_SOC inherits from TYPE_ASPEED_SOC.
4
selection is defined in SCU310[11:8].
4
In few commits we'll add more fields, but to keep
5
Add a get_apb_freq function and a class init handler for ast1030.
5
review process simple, don't add any yet.
6
6
7
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
9
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Message-Id: <20220401083850.15266-7-jamin_lin@aspeedtech.com>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
10
---
14
include/hw/misc/aspeed_scu.h | 25 ++++++++++++++
11
include/hw/arm/aspeed_soc.h | 7 +++++++
15
hw/misc/aspeed_scu.c | 63 ++++++++++++++++++++++++++++++++++++
12
hw/arm/aspeed_ast10x0.c | 26 +++++++++++++-------------
16
2 files changed, 88 insertions(+)
13
2 files changed, 20 insertions(+), 13 deletions(-)
17
14
18
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
19
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
20
--- a/include/hw/misc/aspeed_scu.h
17
--- a/include/hw/arm/aspeed_soc.h
21
+++ b/include/hw/misc/aspeed_scu.h
18
+++ b/include/hw/arm/aspeed_soc.h
22
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSCUState, AspeedSCUClass, ASPEED_SCU)
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
23
#define TYPE_ASPEED_2400_SCU TYPE_ASPEED_SCU "-ast2400"
20
#define TYPE_ASPEED_SOC "aspeed-soc"
24
#define TYPE_ASPEED_2500_SCU TYPE_ASPEED_SCU "-ast2500"
21
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
25
#define TYPE_ASPEED_2600_SCU TYPE_ASPEED_SCU "-ast2600"
22
26
+#define TYPE_ASPEED_1030_SCU TYPE_ASPEED_SCU "-ast1030"
23
+struct Aspeed10x0SoCState {
27
24
+ AspeedSoCState parent;
28
#define ASPEED_SCU_NR_REGS (0x1A8 >> 2)
29
#define ASPEED_AST2600_SCU_NR_REGS (0xE20 >> 2)
30
@@ -XXX,XX +XXX,XX @@ struct AspeedSCUState {
31
#define AST2600_A1_SILICON_REV 0x05010303U
32
#define AST2600_A2_SILICON_REV 0x05020303U
33
#define AST2600_A3_SILICON_REV 0x05030303U
34
+#define AST1030_A0_SILICON_REV 0x80000000U
35
+#define AST1030_A1_SILICON_REV 0x80010000U
36
37
#define ASPEED_IS_AST2500(si_rev) ((((si_rev) >> 24) & 0xff) == 0x04)
38
39
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
40
#define SCU_AST2600_H_PLL_BYPASS_EN (0x1 << 24)
41
#define SCU_AST2600_H_PLL_OFF (0x1 << 23)
42
43
+/*
44
+ * SCU310 Clock Selection Register Set 4 (for Aspeed AST1030 SOC)
45
+ *
46
+ * 31 I3C Clock Source selection
47
+ * 30:28 I3C clock divider selection
48
+ * 26:24 MAC AHB clock divider selection
49
+ * 22:20 RGMII 125MHz clock divider ration
50
+ * 19:16 RGMII 50MHz clock divider ration
51
+ * 15 LHCLK clock generation/output enable control
52
+ * 14:12 LHCLK divider selection
53
+ * 11:8 APB Bus PCLK divider selection
54
+ * 7 Select PECI clock source
55
+ * 6 Select UART debug port clock source
56
+ * 5 Select UART6 clock source
57
+ * 4 Select UART5 clock source
58
+ * 3 Select UART4 clock source
59
+ * 2 Select UART3 clock source
60
+ * 1 Select UART2 clock source
61
+ * 0 Select UART1 clock source
62
+ */
63
+#define SCU_AST1030_CLK_GET_PCLK_DIV(x) (((x) >> 8) & 0xf)
64
+
65
#endif /* ASPEED_SCU_H */
66
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
67
index XXXXXXX..XXXXXXX 100644
68
--- a/hw/misc/aspeed_scu.c
69
+++ b/hw/misc/aspeed_scu.c
70
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2600_scu_get_apb_freq(AspeedSCUState *s)
71
/ asc->apb_divider;
72
}
73
74
+static uint32_t aspeed_1030_scu_get_apb_freq(AspeedSCUState *s)
75
+{
76
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(s);
77
+ uint32_t hpll = asc->calc_hpll(s, s->regs[AST2600_HPLL_PARAM]);
78
+
79
+ return hpll / (SCU_AST1030_CLK_GET_PCLK_DIV(s->regs[AST2600_CLK_SEL4]) + 1)
80
+ / asc->apb_divider;
81
+}
82
+
83
static uint64_t aspeed_scu_read(void *opaque, hwaddr offset, unsigned size)
84
{
85
AspeedSCUState *s = ASPEED_SCU(opaque);
86
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_silicon_revs[] = {
87
AST2600_A1_SILICON_REV,
88
AST2600_A2_SILICON_REV,
89
AST2600_A3_SILICON_REV,
90
+ AST1030_A0_SILICON_REV,
91
+ AST1030_A1_SILICON_REV,
92
};
93
94
bool is_supported_silicon_rev(uint32_t silicon_rev)
95
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_scu_info = {
96
.class_init = aspeed_2600_scu_class_init,
97
};
98
99
+static const uint32_t ast1030_a1_resets[ASPEED_AST2600_SCU_NR_REGS] = {
100
+ [AST2600_SYS_RST_CTRL] = 0xFFC3FED8,
101
+ [AST2600_SYS_RST_CTRL2] = 0x09FFFFFC,
102
+ [AST2600_CLK_STOP_CTRL] = 0xFFFF7F8A,
103
+ [AST2600_CLK_STOP_CTRL2] = 0xFFF0FFF0,
104
+ [AST2600_DEBUG_CTRL2] = 0x00000000,
105
+ [AST2600_HPLL_PARAM] = 0x10004077,
106
+ [AST2600_HPLL_EXT] = 0x00000031,
107
+ [AST2600_CLK_SEL4] = 0x43F90900,
108
+ [AST2600_CLK_SEL5] = 0x40000000,
109
+ [AST2600_CHIP_ID0] = 0xDEADBEEF,
110
+ [AST2600_CHIP_ID1] = 0x0BADCAFE,
111
+};
25
+};
112
+
26
+
113
+static void aspeed_ast1030_scu_reset(DeviceState *dev)
27
+#define TYPE_ASPEED10X0_SOC "aspeed10x0-soc"
114
+{
28
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed10x0SoCState, ASPEED10X0_SOC)
115
+ AspeedSCUState *s = ASPEED_SCU(dev);
116
+ AspeedSCUClass *asc = ASPEED_SCU_GET_CLASS(dev);
117
+
29
+
118
+ memcpy(s->regs, asc->resets, asc->nr_regs * 4);
30
struct AspeedSoCClass {
119
+
31
DeviceClass parent_class;
120
+ s->regs[AST2600_SILICON_REV] = AST1030_A1_SILICON_REV;
32
121
+ s->regs[AST2600_SILICON_REV2] = s->silicon_rev;
33
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
122
+ s->regs[AST2600_HW_STRAP1] = s->hw_strap1;
34
index XXXXXXX..XXXXXXX 100644
123
+ s->regs[AST2600_HW_STRAP2] = s->hw_strap2;
35
--- a/hw/arm/aspeed_ast10x0.c
124
+ s->regs[PROT_KEY] = s->hw_prot_key;
36
+++ b/hw/arm/aspeed_ast10x0.c
125
+}
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
126
+
38
sc->get_irq = aspeed_soc_ast1030_get_irq;
127
+static void aspeed_1030_scu_class_init(ObjectClass *klass, void *data)
128
+{
129
+ DeviceClass *dc = DEVICE_CLASS(klass);
130
+ AspeedSCUClass *asc = ASPEED_SCU_CLASS(klass);
131
+
132
+ dc->desc = "ASPEED 1030 System Control Unit";
133
+ dc->reset = aspeed_ast1030_scu_reset;
134
+ asc->resets = ast1030_a1_resets;
135
+ asc->calc_hpll = aspeed_2600_scu_calc_hpll;
136
+ asc->get_apb = aspeed_1030_scu_get_apb_freq;
137
+ asc->apb_divider = 2;
138
+ asc->nr_regs = ASPEED_AST2600_SCU_NR_REGS;
139
+ asc->clkin_25Mhz = true;
140
+ asc->ops = &aspeed_ast2600_scu_ops;
141
+}
142
+
143
+static const TypeInfo aspeed_1030_scu_info = {
144
+ .name = TYPE_ASPEED_1030_SCU,
145
+ .parent = TYPE_ASPEED_SCU,
146
+ .instance_size = sizeof(AspeedSCUState),
147
+ .class_init = aspeed_1030_scu_class_init,
148
+};
149
+
150
static void aspeed_scu_register_types(void)
151
{
152
type_register_static(&aspeed_scu_info);
153
type_register_static(&aspeed_2400_scu_info);
154
type_register_static(&aspeed_2500_scu_info);
155
type_register_static(&aspeed_2600_scu_info);
156
+ type_register_static(&aspeed_1030_scu_info);
157
}
39
}
158
40
159
type_init(aspeed_scu_register_types);
41
-static const TypeInfo aspeed_soc_ast1030_type_info = {
42
- .name = "ast1030-a1",
43
- .parent = TYPE_ASPEED_SOC,
44
- .instance_size = sizeof(AspeedSoCState),
45
- .instance_init = aspeed_soc_ast1030_init,
46
- .class_init = aspeed_soc_ast1030_class_init,
47
- .class_size = sizeof(AspeedSoCClass),
48
+static const TypeInfo aspeed_soc_ast10x0_types[] = {
49
+ {
50
+ .name = TYPE_ASPEED10X0_SOC,
51
+ .parent = TYPE_ASPEED_SOC,
52
+ .instance_size = sizeof(Aspeed10x0SoCState),
53
+ .abstract = true,
54
+ }, {
55
+ .name = "ast1030-a1",
56
+ .parent = TYPE_ASPEED10X0_SOC,
57
+ .instance_init = aspeed_soc_ast1030_init,
58
+ .class_init = aspeed_soc_ast1030_class_init,
59
+ },
60
};
61
62
-static void aspeed_soc_register_types(void)
63
-{
64
- type_register_static(&aspeed_soc_ast1030_type_info);
65
-}
66
-
67
-type_init(aspeed_soc_register_types)
68
+DEFINE_TYPES(aspeed_soc_ast10x0_types)
160
--
69
--
161
2.35.1
70
2.41.0
162
71
163
72
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
AST1030 wdt controller is similiar to AST2600's wdt, but it has extra
3
TYPE_ASPEED2600_SOC inherits from TYPE_ASPEED_SOC.
4
registers.
4
In few commits we'll add more fields, but to keep
5
Introduce ast1030 object class and increse the number of regs(offset) of
5
review process simple, don't add any yet.
6
ast1030 model.
7
6
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Message-Id: <20220401083850.15266-5-jamin_lin@aspeedtech.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
10
---
15
include/hw/watchdog/wdt_aspeed.h | 1 +
11
include/hw/arm/aspeed_soc.h | 7 +++++++
16
hw/watchdog/wdt_aspeed.c | 24 ++++++++++++++++++++++++
12
hw/arm/aspeed_ast2600.c | 26 +++++++++++++-------------
17
2 files changed, 25 insertions(+)
13
2 files changed, 20 insertions(+), 13 deletions(-)
18
14
19
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/watchdog/wdt_aspeed.h
17
--- a/include/hw/arm/aspeed_soc.h
22
+++ b/include/hw/watchdog/wdt_aspeed.h
18
+++ b/include/hw/arm/aspeed_soc.h
23
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedWDTState, AspeedWDTClass, ASPEED_WDT)
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
24
#define TYPE_ASPEED_2400_WDT TYPE_ASPEED_WDT "-ast2400"
20
#define TYPE_ASPEED_SOC "aspeed-soc"
25
#define TYPE_ASPEED_2500_WDT TYPE_ASPEED_WDT "-ast2500"
21
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
26
#define TYPE_ASPEED_2600_WDT TYPE_ASPEED_WDT "-ast2600"
22
27
+#define TYPE_ASPEED_1030_WDT TYPE_ASPEED_WDT "-ast1030"
23
+struct Aspeed2600SoCState {
28
24
+ AspeedSoCState parent;
29
#define ASPEED_WDT_REGS_MAX (0x20 / 4)
30
31
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
32
index XXXXXXX..XXXXXXX 100644
33
--- a/hw/watchdog/wdt_aspeed.c
34
+++ b/hw/watchdog/wdt_aspeed.c
35
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_wdt_info = {
36
.class_init = aspeed_2600_wdt_class_init,
37
};
38
39
+static void aspeed_1030_wdt_class_init(ObjectClass *klass, void *data)
40
+{
41
+ DeviceClass *dc = DEVICE_CLASS(klass);
42
+ AspeedWDTClass *awc = ASPEED_WDT_CLASS(klass);
43
+
44
+ dc->desc = "ASPEED 1030 Watchdog Controller";
45
+ awc->offset = 0x80;
46
+ awc->ext_pulse_width_mask = 0xfffff; /* TODO */
47
+ awc->reset_ctrl_reg = AST2600_SCU_RESET_CONTROL1;
48
+ awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
49
+ awc->wdt_reload = aspeed_wdt_reload_1mhz;
50
+ awc->sanitize_ctrl = aspeed_2600_sanitize_ctrl;
51
+ awc->default_status = 0x014FB180;
52
+ awc->default_reload_value = 0x014FB180;
53
+}
54
+
55
+static const TypeInfo aspeed_1030_wdt_info = {
56
+ .name = TYPE_ASPEED_1030_WDT,
57
+ .parent = TYPE_ASPEED_WDT,
58
+ .instance_size = sizeof(AspeedWDTState),
59
+ .class_init = aspeed_1030_wdt_class_init,
60
+};
25
+};
61
+
26
+
62
static void wdt_aspeed_register_types(void)
27
+#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
63
{
28
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2600SoCState, ASPEED2600_SOC)
64
watchdog_add_model(&model);
29
+
65
@@ -XXX,XX +XXX,XX @@ static void wdt_aspeed_register_types(void)
30
struct Aspeed10x0SoCState {
66
type_register_static(&aspeed_2400_wdt_info);
31
AspeedSoCState parent;
67
type_register_static(&aspeed_2500_wdt_info);
32
};
68
type_register_static(&aspeed_2600_wdt_info);
33
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
69
+ type_register_static(&aspeed_1030_wdt_info);
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/aspeed_ast2600.c
36
+++ b/hw/arm/aspeed_ast2600.c
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
38
sc->get_irq = aspeed_soc_ast2600_get_irq;
70
}
39
}
71
40
72
type_init(wdt_aspeed_register_types)
41
-static const TypeInfo aspeed_soc_ast2600_type_info = {
42
- .name = "ast2600-a3",
43
- .parent = TYPE_ASPEED_SOC,
44
- .instance_size = sizeof(AspeedSoCState),
45
- .instance_init = aspeed_soc_ast2600_init,
46
- .class_init = aspeed_soc_ast2600_class_init,
47
- .class_size = sizeof(AspeedSoCClass),
48
+static const TypeInfo aspeed_soc_ast2600_types[] = {
49
+ {
50
+ .name = TYPE_ASPEED2600_SOC,
51
+ .parent = TYPE_ASPEED_SOC,
52
+ .instance_size = sizeof(Aspeed2600SoCState),
53
+ .abstract = true,
54
+ }, {
55
+ .name = "ast2600-a3",
56
+ .parent = TYPE_ASPEED2600_SOC,
57
+ .instance_init = aspeed_soc_ast2600_init,
58
+ .class_init = aspeed_soc_ast2600_class_init,
59
+ },
60
};
61
62
-static void aspeed_soc_register_types(void)
63
-{
64
- type_register_static(&aspeed_soc_ast2600_type_info);
65
-};
66
-
67
-type_init(aspeed_soc_register_types)
68
+DEFINE_TYPES(aspeed_soc_ast2600_types)
73
--
69
--
74
2.35.1
70
2.41.0
75
71
76
72
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
ast1030 tmc(timer controller) is identical to ast2600 tmc.
3
TYPE_ASPEED2400_SOC inherits from TYPE_ASPEED_SOC.
4
In few commits we'll add more fields, but to keep
5
review process simple, don't add any yet.
4
6
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
7
TYPE_ASPEED_SOC is common to various Aspeed SoCs,
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
8
define it in aspeed_soc_common.c.
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
9
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Message-Id: <20220401083850.15266-6-jamin_lin@aspeedtech.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
13
---
12
include/hw/timer/aspeed_timer.h | 1 +
14
include/hw/arm/aspeed_soc.h | 7 +++++
13
hw/timer/aspeed_timer.c | 17 +++++++++++++++++
15
hw/arm/aspeed_soc.c | 61 +++++++++++--------------------------
14
2 files changed, 18 insertions(+)
16
hw/arm/aspeed_soc_common.c | 29 ++++++++++++++++++
17
3 files changed, 53 insertions(+), 44 deletions(-)
15
18
16
diff --git a/include/hw/timer/aspeed_timer.h b/include/hw/timer/aspeed_timer.h
19
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/timer/aspeed_timer.h
21
--- a/include/hw/arm/aspeed_soc.h
19
+++ b/include/hw/timer/aspeed_timer.h
22
+++ b/include/hw/arm/aspeed_soc.h
20
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedTimerCtrlState, AspeedTimerClass, ASPEED_TIMER)
23
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
21
#define TYPE_ASPEED_2400_TIMER TYPE_ASPEED_TIMER "-ast2400"
24
#define TYPE_ASPEED_SOC "aspeed-soc"
22
#define TYPE_ASPEED_2500_TIMER TYPE_ASPEED_TIMER "-ast2500"
25
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
23
#define TYPE_ASPEED_2600_TIMER TYPE_ASPEED_TIMER "-ast2600"
26
24
+#define TYPE_ASPEED_1030_TIMER TYPE_ASPEED_TIMER "-ast1030"
27
+struct Aspeed2400SoCState {
25
28
+ AspeedSoCState parent;
26
#define ASPEED_TIMER_NR_TIMERS 8
29
+};
27
30
+
28
diff --git a/hw/timer/aspeed_timer.c b/hw/timer/aspeed_timer.c
31
+#define TYPE_ASPEED2400_SOC "aspeed2400-soc"
32
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2400SoCState, ASPEED2400_SOC)
33
+
34
struct Aspeed2600SoCState {
35
AspeedSoCState parent;
36
};
37
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
29
index XXXXXXX..XXXXXXX 100644
38
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/timer/aspeed_timer.c
39
--- a/hw/arm/aspeed_soc.c
31
+++ b/hw/timer/aspeed_timer.c
40
+++ b/hw/arm/aspeed_soc.c
32
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_timer_info = {
41
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
33
.class_init = aspeed_2600_timer_class_init,
42
sysbus_connect_irq(SYS_BUS_DEVICE(&s->hace), 0,
43
aspeed_soc_get_irq(s, ASPEED_DEV_HACE));
44
}
45
-static Property aspeed_soc_properties[] = {
46
- DEFINE_PROP_LINK("memory", AspeedSoCState, memory, TYPE_MEMORY_REGION,
47
- MemoryRegion *),
48
- DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
49
- MemoryRegion *),
50
- DEFINE_PROP_END_OF_LIST(),
51
-};
52
-
53
-static void aspeed_soc_class_init(ObjectClass *oc, void *data)
54
-{
55
- DeviceClass *dc = DEVICE_CLASS(oc);
56
-
57
- device_class_set_props(dc, aspeed_soc_properties);
58
-}
59
-
60
-static const TypeInfo aspeed_soc_type_info = {
61
- .name = TYPE_ASPEED_SOC,
62
- .parent = TYPE_DEVICE,
63
- .instance_size = sizeof(AspeedSoCState),
64
- .class_size = sizeof(AspeedSoCClass),
65
- .class_init = aspeed_soc_class_init,
66
- .abstract = true,
67
-};
68
69
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
70
{
71
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
72
sc->get_irq = aspeed_soc_ast2400_get_irq;
73
}
74
75
-static const TypeInfo aspeed_soc_ast2400_type_info = {
76
- .name = "ast2400-a1",
77
- .parent = TYPE_ASPEED_SOC,
78
- .instance_init = aspeed_ast2400_soc_init,
79
- .instance_size = sizeof(AspeedSoCState),
80
- .class_init = aspeed_soc_ast2400_class_init,
81
-};
82
-
83
static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
84
{
85
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
86
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
87
sc->get_irq = aspeed_soc_ast2400_get_irq;
88
}
89
90
-static const TypeInfo aspeed_soc_ast2500_type_info = {
91
- .name = "ast2500-a1",
92
- .parent = TYPE_ASPEED_SOC,
93
- .instance_init = aspeed_ast2400_soc_init,
94
- .instance_size = sizeof(AspeedSoCState),
95
- .class_init = aspeed_soc_ast2500_class_init,
96
-};
97
-static void aspeed_soc_register_types(void)
98
-{
99
- type_register_static(&aspeed_soc_type_info);
100
- type_register_static(&aspeed_soc_ast2400_type_info);
101
- type_register_static(&aspeed_soc_ast2500_type_info);
102
+static const TypeInfo aspeed_soc_ast2400_types[] = {
103
+ {
104
+ .name = TYPE_ASPEED2400_SOC,
105
+ .parent = TYPE_ASPEED_SOC,
106
+ .instance_init = aspeed_ast2400_soc_init,
107
+ .instance_size = sizeof(Aspeed2400SoCState),
108
+ .abstract = true,
109
+ }, {
110
+ .name = "ast2400-a1",
111
+ .parent = TYPE_ASPEED2400_SOC,
112
+ .class_init = aspeed_soc_ast2400_class_init,
113
+ }, {
114
+ .name = "ast2500-a1",
115
+ .parent = TYPE_ASPEED2400_SOC,
116
+ .class_init = aspeed_soc_ast2500_class_init,
117
+ },
34
};
118
};
35
119
36
+static void aspeed_1030_timer_class_init(ObjectClass *klass, void *data)
120
-type_init(aspeed_soc_register_types);
121
+DEFINE_TYPES(aspeed_soc_ast2400_types)
122
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
123
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/arm/aspeed_soc_common.c
125
+++ b/hw/arm/aspeed_soc_common.c
126
@@ -XXX,XX +XXX,XX @@
127
128
#include "qemu/osdep.h"
129
#include "qapi/error.h"
130
+#include "hw/qdev-properties.h"
131
#include "hw/misc/unimp.h"
132
#include "hw/arm/aspeed_soc.h"
133
#include "hw/char/serial.h"
134
@@ -XXX,XX +XXX,XX @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
135
memory_region_add_subregion_overlap(s->memory, addr,
136
sysbus_mmio_get_region(dev, 0), -1000);
137
}
138
+
139
+static Property aspeed_soc_properties[] = {
140
+ DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
141
+ MemoryRegion *),
142
+ DEFINE_PROP_LINK("memory", AspeedSoCState, memory, TYPE_MEMORY_REGION,
143
+ MemoryRegion *),
144
+ DEFINE_PROP_END_OF_LIST(),
145
+};
146
+
147
+static void aspeed_soc_class_init(ObjectClass *oc, void *data)
37
+{
148
+{
38
+ DeviceClass *dc = DEVICE_CLASS(klass);
149
+ DeviceClass *dc = DEVICE_CLASS(oc);
39
+ AspeedTimerClass *awc = ASPEED_TIMER_CLASS(klass);
40
+
150
+
41
+ dc->desc = "ASPEED 1030 Timer";
151
+ device_class_set_props(dc, aspeed_soc_properties);
42
+ awc->read = aspeed_2600_timer_read;
43
+ awc->write = aspeed_2600_timer_write;
44
+}
152
+}
45
+
153
+
46
+static const TypeInfo aspeed_1030_timer_info = {
154
+static const TypeInfo aspeed_soc_types[] = {
47
+ .name = TYPE_ASPEED_1030_TIMER,
155
+ {
48
+ .parent = TYPE_ASPEED_TIMER,
156
+ .name = TYPE_ASPEED_SOC,
49
+ .class_init = aspeed_1030_timer_class_init,
157
+ .parent = TYPE_DEVICE,
158
+ .instance_size = sizeof(AspeedSoCState),
159
+ .class_size = sizeof(AspeedSoCClass),
160
+ .class_init = aspeed_soc_class_init,
161
+ .abstract = true,
162
+ },
50
+};
163
+};
51
+
164
+
52
static void aspeed_timer_register_types(void)
165
+DEFINE_TYPES(aspeed_soc_types)
53
{
54
type_register_static(&aspeed_timer_info);
55
type_register_static(&aspeed_2400_timer_info);
56
type_register_static(&aspeed_2500_timer_info);
57
type_register_static(&aspeed_2600_timer_info);
58
+ type_register_static(&aspeed_1030_timer_info);
59
}
60
61
type_init(aspeed_timer_register_types)
62
--
166
--
63
2.35.1
167
2.41.0
64
168
65
169
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
AST1030 spi controller's address decoding unit is 1MB that is identical
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
to ast2600, but fmc address decoding unit is 512kb.
5
Introduce seg_to_reg and reg_to_seg handlers for ast1030 fmc controller.
6
In addition, add ast1030 fmc, spi1, and spi2 class init handler.
7
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Message-Id: <20220401083850.15266-3-jamin_lin@aspeedtech.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
6
---
15
hw/ssi/aspeed_smc.c | 157 ++++++++++++++++++++++++++++++++++++++++++++
7
hw/arm/aspeed_soc_common.c | 11 +++++++++++
16
1 file changed, 157 insertions(+)
8
1 file changed, 11 insertions(+)
17
9
18
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
10
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
19
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
20
--- a/hw/ssi/aspeed_smc.c
12
--- a/hw/arm/aspeed_soc_common.c
21
+++ b/hw/ssi/aspeed_smc.c
13
+++ b/hw/arm/aspeed_soc_common.c
22
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_spi2_info = {
14
@@ -XXX,XX +XXX,XX @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
23
.class_init = aspeed_2600_spi2_class_init,
15
sysbus_mmio_get_region(dev, 0), -1000);
24
};
16
}
25
17
26
+/*
18
+static void aspeed_soc_realize(DeviceState *dev, Error **errp)
27
+ * The FMC Segment Registers of the AST1030 have a 512KB unit.
19
+{
28
+ * Only bits [27:19] are used for decoding.
20
+ AspeedSoCState *s = ASPEED_SOC(dev);
29
+ */
30
+#define AST1030_SEG_ADDR_MASK 0x0ff80000
31
+
21
+
32
+static uint32_t aspeed_1030_smc_segment_to_reg(const AspeedSMCState *s,
22
+ if (!s->memory) {
33
+ const AspeedSegments *seg)
23
+ error_setg(errp, "'memory' link is not set");
34
+{
24
+ return;
35
+ uint32_t reg = 0;
36
+
37
+ /* Disabled segments have a nil register */
38
+ if (!seg->size) {
39
+ return 0;
40
+ }
41
+
42
+ reg |= (seg->addr & AST1030_SEG_ADDR_MASK) >> 16; /* start offset */
43
+ reg |= (seg->addr + seg->size - 1) & AST1030_SEG_ADDR_MASK; /* end offset */
44
+ return reg;
45
+}
46
+
47
+static void aspeed_1030_smc_reg_to_segment(const AspeedSMCState *s,
48
+ uint32_t reg, AspeedSegments *seg)
49
+{
50
+ uint32_t start_offset = (reg << 16) & AST1030_SEG_ADDR_MASK;
51
+ uint32_t end_offset = reg & AST1030_SEG_ADDR_MASK;
52
+ AspeedSMCClass *asc = ASPEED_SMC_GET_CLASS(s);
53
+
54
+ if (reg) {
55
+ seg->addr = asc->flash_window_base + start_offset;
56
+ seg->size = end_offset + (512 * KiB) - start_offset;
57
+ } else {
58
+ seg->addr = asc->flash_window_base;
59
+ seg->size = 0;
60
+ }
25
+ }
61
+}
26
+}
62
+
27
+
63
+static const uint32_t aspeed_1030_fmc_resets[ASPEED_SMC_R_MAX] = {
28
static Property aspeed_soc_properties[] = {
64
+ [R_CONF] = (CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE0 |
29
DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
65
+ CONF_FLASH_TYPE_SPI << CONF_FLASH_TYPE1),
30
MemoryRegion *),
66
+};
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
67
+
68
+static const AspeedSegments aspeed_1030_fmc_segments[] = {
69
+ { 0x0, 128 * MiB }, /* start address is readonly */
70
+ { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kernel */
71
+ { 0x0, 0 }, /* disabled */
72
+};
73
+
74
+static void aspeed_1030_fmc_class_init(ObjectClass *klass, void *data)
75
+{
76
+ DeviceClass *dc = DEVICE_CLASS(klass);
77
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
78
+
79
+ dc->desc = "Aspeed 1030 FMC Controller";
80
+ asc->r_conf = R_CONF;
81
+ asc->r_ce_ctrl = R_CE_CTRL;
82
+ asc->r_ctrl0 = R_CTRL0;
83
+ asc->r_timings = R_TIMINGS;
84
+ asc->nregs_timings = 2;
85
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
86
+ asc->cs_num_max = 2;
87
+ asc->segments = aspeed_1030_fmc_segments;
88
+ asc->segment_addr_mask = 0x0ff80ff8;
89
+ asc->resets = aspeed_1030_fmc_resets;
90
+ asc->flash_window_base = 0x80000000;
91
+ asc->flash_window_size = 0x10000000;
92
+ asc->features = ASPEED_SMC_FEATURE_DMA;
93
+ asc->dma_flash_mask = 0x0FFFFFFC;
94
+ asc->dma_dram_mask = 0x000BFFFC;
95
+ asc->nregs = ASPEED_SMC_R_MAX;
96
+ asc->segment_to_reg = aspeed_1030_smc_segment_to_reg;
97
+ asc->reg_to_segment = aspeed_1030_smc_reg_to_segment;
98
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
99
+}
100
+
101
+static const TypeInfo aspeed_1030_fmc_info = {
102
+ .name = "aspeed.fmc-ast1030",
103
+ .parent = TYPE_ASPEED_SMC,
104
+ .class_init = aspeed_1030_fmc_class_init,
105
+};
106
+
107
+static const AspeedSegments aspeed_1030_spi1_segments[] = {
108
+ { 0x0, 128 * MiB }, /* start address is readonly */
109
+ { 0x0, 0 }, /* disabled */
110
+};
111
+
112
+static void aspeed_1030_spi1_class_init(ObjectClass *klass, void *data)
113
+{
114
+ DeviceClass *dc = DEVICE_CLASS(klass);
115
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
116
+
117
+ dc->desc = "Aspeed 1030 SPI1 Controller";
118
+ asc->r_conf = R_CONF;
119
+ asc->r_ce_ctrl = R_CE_CTRL;
120
+ asc->r_ctrl0 = R_CTRL0;
121
+ asc->r_timings = R_TIMINGS;
122
+ asc->nregs_timings = 2;
123
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
124
+ asc->cs_num_max = 2;
125
+ asc->segments = aspeed_1030_spi1_segments;
126
+ asc->segment_addr_mask = 0x0ff00ff0;
127
+ asc->flash_window_base = 0x90000000;
128
+ asc->flash_window_size = 0x10000000;
129
+ asc->features = ASPEED_SMC_FEATURE_DMA;
130
+ asc->dma_flash_mask = 0x0FFFFFFC;
131
+ asc->dma_dram_mask = 0x000BFFFC;
132
+ asc->nregs = ASPEED_SMC_R_MAX;
133
+ asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
134
+ asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
135
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
136
+}
137
+
138
+static const TypeInfo aspeed_1030_spi1_info = {
139
+ .name = "aspeed.spi1-ast1030",
140
+ .parent = TYPE_ASPEED_SMC,
141
+ .class_init = aspeed_1030_spi1_class_init,
142
+};
143
+static const AspeedSegments aspeed_1030_spi2_segments[] = {
144
+ { 0x0, 128 * MiB }, /* start address is readonly */
145
+ { 0x0, 0 }, /* disabled */
146
+};
147
+
148
+static void aspeed_1030_spi2_class_init(ObjectClass *klass, void *data)
149
+{
150
+ DeviceClass *dc = DEVICE_CLASS(klass);
151
+ AspeedSMCClass *asc = ASPEED_SMC_CLASS(klass);
152
+
153
+ dc->desc = "Aspeed 1030 SPI2 Controller";
154
+ asc->r_conf = R_CONF;
155
+ asc->r_ce_ctrl = R_CE_CTRL;
156
+ asc->r_ctrl0 = R_CTRL0;
157
+ asc->r_timings = R_TIMINGS;
158
+ asc->nregs_timings = 2;
159
+ asc->conf_enable_w0 = CONF_ENABLE_W0;
160
+ asc->cs_num_max = 2;
161
+ asc->segments = aspeed_1030_spi2_segments;
162
+ asc->segment_addr_mask = 0x0ff00ff0;
163
+ asc->flash_window_base = 0xb0000000;
164
+ asc->flash_window_size = 0x10000000;
165
+ asc->features = ASPEED_SMC_FEATURE_DMA;
166
+ asc->dma_flash_mask = 0x0FFFFFFC;
167
+ asc->dma_dram_mask = 0x000BFFFC;
168
+ asc->nregs = ASPEED_SMC_R_MAX;
169
+ asc->segment_to_reg = aspeed_2600_smc_segment_to_reg;
170
+ asc->reg_to_segment = aspeed_2600_smc_reg_to_segment;
171
+ asc->dma_ctrl = aspeed_2600_smc_dma_ctrl;
172
+}
173
+
174
+static const TypeInfo aspeed_1030_spi2_info = {
175
+ .name = "aspeed.spi2-ast1030",
176
+ .parent = TYPE_ASPEED_SMC,
177
+ .class_init = aspeed_1030_spi2_class_init,
178
+};
179
+
180
static void aspeed_smc_register_types(void)
181
{
32
{
182
type_register_static(&aspeed_smc_flash_info);
33
DeviceClass *dc = DEVICE_CLASS(oc);
183
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_register_types(void)
34
184
type_register_static(&aspeed_2600_fmc_info);
35
+ dc->realize = aspeed_soc_realize;
185
type_register_static(&aspeed_2600_spi1_info);
36
device_class_set_props(dc, aspeed_soc_properties);
186
type_register_static(&aspeed_2600_spi2_info);
187
+ type_register_static(&aspeed_1030_fmc_info);
188
+ type_register_static(&aspeed_1030_spi1_info);
189
+ type_register_static(&aspeed_1030_spi2_info);
190
}
37
}
191
38
192
type_init(aspeed_smc_register_types)
193
--
39
--
194
2.35.1
40
2.41.0
195
41
196
42
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Per ast2500_2520_datasheet_v1.8 and ast2600v11.pdf, the default value of
3
The v7-M core is specific to the Aspeed 10x0 series,
4
WDT00 and WDT04 is 0x014FB180 for ast2500/ast2600.
4
remove it from the common AspeedSoCState.
5
Add default_status and default_reload_value attributes for storing
6
counter status and reload value as they are different from ast2400.
7
5
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Message-Id: <20220401083850.15266-4-jamin_lin@aspeedtech.com>
13
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
---
9
---
15
include/hw/watchdog/wdt_aspeed.h | 2 ++
10
include/hw/arm/aspeed_soc.h | 5 ++---
16
hw/watchdog/wdt_aspeed.c | 10 ++++++++--
11
hw/arm/aspeed_ast10x0.c | 27 +++++++++++++++------------
17
2 files changed, 10 insertions(+), 2 deletions(-)
12
hw/arm/fby35.c | 13 ++++++++-----
13
3 files changed, 25 insertions(+), 20 deletions(-)
18
14
19
diff --git a/include/hw/watchdog/wdt_aspeed.h b/include/hw/watchdog/wdt_aspeed.h
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
20
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/watchdog/wdt_aspeed.h
17
--- a/include/hw/arm/aspeed_soc.h
22
+++ b/include/hw/watchdog/wdt_aspeed.h
18
+++ b/include/hw/arm/aspeed_soc.h
23
@@ -XXX,XX +XXX,XX @@ struct AspeedWDTClass {
19
@@ -XXX,XX +XXX,XX @@
24
void (*reset_pulse)(AspeedWDTState *s, uint32_t property);
20
#define ASPEED_JTAG_NUM 2
25
void (*wdt_reload)(AspeedWDTState *s);
21
26
uint64_t (*sanitize_ctrl)(uint64_t data);
22
struct AspeedSoCState {
27
+ uint32_t default_status;
23
- /*< private >*/
28
+ uint32_t default_reload_value;
24
DeviceState parent;
25
26
- /*< public >*/
27
ARMCPU cpu[ASPEED_CPUS_NUM];
28
A15MPPrivState a7mpcore;
29
- ARMv7MState armv7m;
30
MemoryRegion *memory;
31
MemoryRegion *dram_mr;
32
MemoryRegion dram_container;
33
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2600SoCState, ASPEED2600_SOC)
34
35
struct Aspeed10x0SoCState {
36
AspeedSoCState parent;
37
+
38
+ ARMv7MState armv7m;
29
};
39
};
30
40
31
#endif /* WDT_ASPEED_H */
41
#define TYPE_ASPEED10X0_SOC "aspeed10x0-soc"
32
diff --git a/hw/watchdog/wdt_aspeed.c b/hw/watchdog/wdt_aspeed.c
42
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
33
index XXXXXXX..XXXXXXX 100644
43
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/watchdog/wdt_aspeed.c
44
--- a/hw/arm/aspeed_ast10x0.c
35
+++ b/hw/watchdog/wdt_aspeed.c
45
+++ b/hw/arm/aspeed_ast10x0.c
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_wdt_reset(DeviceState *dev)
46
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast1030_irqmap[] = {
37
AspeedWDTState *s = ASPEED_WDT(dev);
47
38
AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(s);
48
static qemu_irq aspeed_soc_ast1030_get_irq(AspeedSoCState *s, int dev)
39
49
{
40
- s->regs[WDT_STATUS] = 0x3EF1480;
50
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(s);
41
- s->regs[WDT_RELOAD_VALUE] = 0x03EF1480;
51
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
42
+ s->regs[WDT_STATUS] = awc->default_status;
52
43
+ s->regs[WDT_RELOAD_VALUE] = awc->default_reload_value;
53
- return qdev_get_gpio_in(DEVICE(&s->armv7m), sc->irqmap[dev]);
44
s->regs[WDT_RESTART] = 0;
54
+ return qdev_get_gpio_in(DEVICE(&a->armv7m), sc->irqmap[dev]);
45
s->regs[WDT_CTRL] = awc->sanitize_ctrl(0);
46
s->regs[WDT_RESET_WIDTH] = 0xFF;
47
@@ -XXX,XX +XXX,XX @@ static void aspeed_2400_wdt_class_init(ObjectClass *klass, void *data)
48
awc->reset_ctrl_reg = SCU_RESET_CONTROL1;
49
awc->wdt_reload = aspeed_wdt_reload;
50
awc->sanitize_ctrl = aspeed_2400_sanitize_ctrl;
51
+ awc->default_status = 0x03EF1480;
52
+ awc->default_reload_value = 0x03EF1480;
53
}
55
}
54
56
55
static const TypeInfo aspeed_2400_wdt_info = {
57
static void aspeed_soc_ast1030_init(Object *obj)
56
@@ -XXX,XX +XXX,XX @@ static void aspeed_2500_wdt_class_init(ObjectClass *klass, void *data)
58
{
57
awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
59
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(obj);
58
awc->wdt_reload = aspeed_wdt_reload_1mhz;
60
AspeedSoCState *s = ASPEED_SOC(obj);
59
awc->sanitize_ctrl = aspeed_2500_sanitize_ctrl;
61
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
60
+ awc->default_status = 0x014FB180;
62
char socname[8];
61
+ awc->default_reload_value = 0x014FB180;
63
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
64
g_assert_not_reached();
65
}
66
67
- object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
68
+ object_initialize_child(obj, "armv7m", &a->armv7m, TYPE_ARMV7M);
69
70
s->sysclk = qdev_init_clock_in(DEVICE(s), "sysclk", NULL, NULL, 0);
71
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
73
74
static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
75
{
76
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(dev_soc);
77
AspeedSoCState *s = ASPEED_SOC(dev_soc);
78
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
79
DeviceState *armv7m;
80
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
81
0x40000);
82
83
/* AST1030 CPU Core */
84
- armv7m = DEVICE(&s->armv7m);
85
+ armv7m = DEVICE(&a->armv7m);
86
qdev_prop_set_uint32(armv7m, "num-irq", 256);
87
qdev_prop_set_string(armv7m, "cpu-type", sc->cpu_type);
88
qdev_connect_clock_in(armv7m, "cpuclk", s->sysclk);
89
- object_property_set_link(OBJECT(&s->armv7m), "memory",
90
+ object_property_set_link(OBJECT(&a->armv7m), "memory",
91
OBJECT(s->memory), &error_abort);
92
- sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &error_abort);
93
+ sysbus_realize(SYS_BUS_DEVICE(&a->armv7m), &error_abort);
94
95
/* Internal SRAM */
96
sram_name = g_strdup_printf("aspeed.sram.%d",
97
- CPU(s->armv7m.cpu)->cpu_index);
98
+ CPU(a->armv7m.cpu)->cpu_index);
99
memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
100
if (err != NULL) {
101
error_propagate(errp, err);
102
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
103
}
104
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_DEV_I2C]);
105
for (i = 0; i < ASPEED_I2C_GET_CLASS(&s->i2c)->num_busses; i++) {
106
- qemu_irq irq = qdev_get_gpio_in(DEVICE(&s->armv7m),
107
+ qemu_irq irq = qdev_get_gpio_in(DEVICE(&a->armv7m),
108
sc->irqmap[ASPEED_DEV_I2C] + i);
109
/* The AST1030 I2C controller has one IRQ per bus. */
110
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c.busses[i]), 0, irq);
111
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
112
}
113
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->i3c), 0, sc->memmap[ASPEED_DEV_I3C]);
114
for (i = 0; i < ASPEED_I3C_NR_DEVICES; i++) {
115
- qemu_irq irq = qdev_get_gpio_in(DEVICE(&s->armv7m),
116
+ qemu_irq irq = qdev_get_gpio_in(DEVICE(&a->armv7m),
117
sc->irqmap[ASPEED_DEV_I3C] + i);
118
/* The AST1030 I3C controller has one IRQ per bus. */
119
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i3c.devices[i]), 0, irq);
120
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
121
* On the AST1030 LPC subdevice IRQs are connected straight to the GIC.
122
*/
123
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_1,
124
- qdev_get_gpio_in(DEVICE(&s->armv7m),
125
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
126
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_1));
127
128
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_2,
129
- qdev_get_gpio_in(DEVICE(&s->armv7m),
130
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
131
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_2));
132
133
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_3,
134
- qdev_get_gpio_in(DEVICE(&s->armv7m),
135
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
136
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_3));
137
138
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_4,
139
- qdev_get_gpio_in(DEVICE(&s->armv7m),
140
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
141
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_4));
142
143
/* UART */
144
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
145
index XXXXXXX..XXXXXXX 100644
146
--- a/hw/arm/fby35.c
147
+++ b/hw/arm/fby35.c
148
@@ -XXX,XX +XXX,XX @@ struct Fby35State {
149
Clock *bic_sysclk;
150
151
AspeedSoCState bmc;
152
- AspeedSoCState bic;
153
+ Aspeed10x0SoCState bic;
154
155
bool mmio_exec;
156
};
157
@@ -XXX,XX +XXX,XX @@ static void fby35_bmc_init(Fby35State *s)
158
159
static void fby35_bic_init(Fby35State *s)
160
{
161
+ AspeedSoCState *soc;
162
+
163
s->bic_sysclk = clock_new(OBJECT(s), "SYSCLK");
164
clock_set_hz(s->bic_sysclk, 200000000ULL);
165
166
object_initialize_child(OBJECT(s), "bic", &s->bic, "ast1030-a1");
167
+ soc = ASPEED_SOC(&s->bic);
168
169
memory_region_init(&s->bic_memory, OBJECT(&s->bic), "bic-memory",
170
UINT64_MAX);
171
@@ -XXX,XX +XXX,XX @@ static void fby35_bic_init(Fby35State *s)
172
qdev_connect_clock_in(DEVICE(&s->bic), "sysclk", s->bic_sysclk);
173
object_property_set_link(OBJECT(&s->bic), "memory", OBJECT(&s->bic_memory),
174
&error_abort);
175
- aspeed_soc_uart_set_chr(&s->bic, ASPEED_DEV_UART5, serial_hd(1));
176
+ aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART5, serial_hd(1));
177
qdev_realize(DEVICE(&s->bic), NULL, &error_abort);
178
179
- aspeed_board_init_flashes(&s->bic.fmc, "sst25vf032b", 2, 2);
180
- aspeed_board_init_flashes(&s->bic.spi[0], "sst25vf032b", 2, 4);
181
- aspeed_board_init_flashes(&s->bic.spi[1], "sst25vf032b", 2, 6);
182
+ aspeed_board_init_flashes(&soc->fmc, "sst25vf032b", 2, 2);
183
+ aspeed_board_init_flashes(&soc->spi[0], "sst25vf032b", 2, 4);
184
+ aspeed_board_init_flashes(&soc->spi[1], "sst25vf032b", 2, 6);
62
}
185
}
63
186
64
static const TypeInfo aspeed_2500_wdt_info = {
187
static void fby35_init(MachineState *machine)
65
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_wdt_class_init(ObjectClass *klass, void *data)
66
awc->reset_pulse = aspeed_2500_wdt_reset_pulse;
67
awc->wdt_reload = aspeed_wdt_reload_1mhz;
68
awc->sanitize_ctrl = aspeed_2600_sanitize_ctrl;
69
+ awc->default_status = 0x014FB180;
70
+ awc->default_reload_value = 0x014FB180;
71
}
72
73
static const TypeInfo aspeed_2600_wdt_info = {
74
--
188
--
75
2.35.1
189
2.41.0
76
190
77
191
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Guest code (u-boot) pokes at this on boot. No functionality is required
3
The v7-A cluster is specific to the Aspeed 2600 series,
4
for guest code to work correctly, but it helps to document the region
4
remove it from the common AspeedSoCState.
5
being read from.
5
6
6
The ARM cores belong to the MP cluster, but the array
7
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
is currently used by TYPE_ASPEED2600_SOC. We'll clean
8
that soon, but for now keep it in Aspeed2600SoCState.
9
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Message-Id: <20220318092211.723938-1-joel@jms.id.au>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
13
---
12
include/hw/arm/aspeed_soc.h | 1 +
14
include/hw/arm/aspeed_soc.h | 4 ++-
13
hw/arm/aspeed_ast2600.c | 6 ++++++
15
hw/arm/aspeed_ast2600.c | 49 ++++++++++++++++++++-----------------
14
2 files changed, 7 insertions(+)
16
hw/arm/fby35.c | 14 ++++++-----
17
3 files changed, 37 insertions(+), 30 deletions(-)
15
18
16
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
19
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
17
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/aspeed_soc.h
21
--- a/include/hw/arm/aspeed_soc.h
19
+++ b/include/hw/arm/aspeed_soc.h
22
+++ b/include/hw/arm/aspeed_soc.h
20
@@ -XXX,XX +XXX,XX @@ enum {
23
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
21
ASPEED_DEV_SCU,
24
DeviceState parent;
22
ASPEED_DEV_ADC,
25
23
ASPEED_DEV_SBC,
26
ARMCPU cpu[ASPEED_CPUS_NUM];
24
+ ASPEED_DEV_EMMC_BC,
27
- A15MPPrivState a7mpcore;
25
ASPEED_DEV_VIDEO,
28
MemoryRegion *memory;
26
ASPEED_DEV_SRAM,
29
MemoryRegion *dram_mr;
27
ASPEED_DEV_SDHCI,
30
MemoryRegion dram_container;
31
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2400SoCState, ASPEED2400_SOC)
32
33
struct Aspeed2600SoCState {
34
AspeedSoCState parent;
35
+
36
+ A15MPPrivState a7mpcore;
37
+ ARMCPU cpu[ASPEED_CPUS_NUM]; /* XXX belong to a7mpcore */
38
};
39
40
#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
28
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
41
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
29
index XXXXXXX..XXXXXXX 100644
42
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/arm/aspeed_ast2600.c
43
--- a/hw/arm/aspeed_ast2600.c
31
+++ b/hw/arm/aspeed_ast2600.c
44
+++ b/hw/arm/aspeed_ast2600.c
32
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
45
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
33
[ASPEED_DEV_ADC] = 0x1E6E9000,
46
34
[ASPEED_DEV_DP] = 0x1E6EB000,
47
static qemu_irq aspeed_soc_ast2600_get_irq(AspeedSoCState *s, int dev)
35
[ASPEED_DEV_SBC] = 0x1E6F2000,
48
{
36
+ [ASPEED_DEV_EMMC_BC] = 0x1E6f5000,
49
+ Aspeed2600SoCState *a = ASPEED2600_SOC(s);
37
[ASPEED_DEV_VIDEO] = 0x1E700000,
50
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
38
[ASPEED_DEV_SDHCI] = 0x1E740000,
51
39
[ASPEED_DEV_EMMC] = 0x1E750000,
52
- return qdev_get_gpio_in(DEVICE(&s->a7mpcore), sc->irqmap[dev]);
40
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
53
+ return qdev_get_gpio_in(DEVICE(&a->a7mpcore), sc->irqmap[dev]);
41
create_unimplemented_device("aspeed.video", sc->memmap[ASPEED_DEV_VIDEO],
54
}
42
0x1000);
55
43
56
static void aspeed_soc_ast2600_init(Object *obj)
44
+ /* eMMC Boot Controller stub */
57
{
45
+ create_unimplemented_device("aspeed.emmc-boot-controller",
58
+ Aspeed2600SoCState *a = ASPEED2600_SOC(obj);
46
+ sc->memmap[ASPEED_DEV_EMMC_BC],
59
AspeedSoCState *s = ASPEED_SOC(obj);
47
+ 0x1000);
60
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
48
+
61
int i;
62
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
63
}
64
65
for (i = 0; i < sc->num_cpus; i++) {
66
- object_initialize_child(obj, "cpu[*]", &s->cpu[i], sc->cpu_type);
67
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
68
}
69
70
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
71
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
72
object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu),
73
"hw-prot-key");
74
75
- object_initialize_child(obj, "a7mpcore", &s->a7mpcore,
76
+ object_initialize_child(obj, "a7mpcore", &a->a7mpcore,
77
TYPE_A15MPCORE_PRIV);
78
79
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
80
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_calc_affinity(int cpu)
81
static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
82
{
83
int i;
84
+ Aspeed2600SoCState *a = ASPEED2600_SOC(dev);
85
AspeedSoCState *s = ASPEED_SOC(dev);
86
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
87
Error *err = NULL;
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
49
/* CPU */
89
/* CPU */
50
for (i = 0; i < sc->num_cpus; i++) {
90
for (i = 0; i < sc->num_cpus; i++) {
51
if (sc->num_cpus > 1) {
91
if (sc->num_cpus > 1) {
92
- object_property_set_int(OBJECT(&s->cpu[i]), "reset-cbar",
93
+ object_property_set_int(OBJECT(&a->cpu[i]), "reset-cbar",
94
ASPEED_A7MPCORE_ADDR, &error_abort);
95
}
96
- object_property_set_int(OBJECT(&s->cpu[i]), "mp-affinity",
97
+ object_property_set_int(OBJECT(&a->cpu[i]), "mp-affinity",
98
aspeed_calc_affinity(i), &error_abort);
99
100
- object_property_set_int(OBJECT(&s->cpu[i]), "cntfrq", 1125000000,
101
+ object_property_set_int(OBJECT(&a->cpu[i]), "cntfrq", 1125000000,
102
&error_abort);
103
- object_property_set_bool(OBJECT(&s->cpu[i]), "neon", false,
104
+ object_property_set_bool(OBJECT(&a->cpu[i]), "neon", false,
105
&error_abort);
106
- object_property_set_bool(OBJECT(&s->cpu[i]), "vfp-d32", false,
107
+ object_property_set_bool(OBJECT(&a->cpu[i]), "vfp-d32", false,
108
&error_abort);
109
- object_property_set_link(OBJECT(&s->cpu[i]), "memory",
110
+ object_property_set_link(OBJECT(&a->cpu[i]), "memory",
111
OBJECT(s->memory), &error_abort);
112
113
- if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
114
+ if (!qdev_realize(DEVICE(&a->cpu[i]), NULL, errp)) {
115
return;
116
}
117
}
118
119
/* A7MPCORE */
120
- object_property_set_int(OBJECT(&s->a7mpcore), "num-cpu", sc->num_cpus,
121
+ object_property_set_int(OBJECT(&a->a7mpcore), "num-cpu", sc->num_cpus,
122
&error_abort);
123
- object_property_set_int(OBJECT(&s->a7mpcore), "num-irq",
124
+ object_property_set_int(OBJECT(&a->a7mpcore), "num-irq",
125
ROUND_UP(AST2600_MAX_IRQ + GIC_INTERNAL, 32),
126
&error_abort);
127
128
- sysbus_realize(SYS_BUS_DEVICE(&s->a7mpcore), &error_abort);
129
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->a7mpcore), 0, ASPEED_A7MPCORE_ADDR);
130
+ sysbus_realize(SYS_BUS_DEVICE(&a->a7mpcore), &error_abort);
131
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&a->a7mpcore), 0, ASPEED_A7MPCORE_ADDR);
132
133
for (i = 0; i < sc->num_cpus; i++) {
134
- SysBusDevice *sbd = SYS_BUS_DEVICE(&s->a7mpcore);
135
- DeviceState *d = DEVICE(&s->cpu[i]);
136
+ SysBusDevice *sbd = SYS_BUS_DEVICE(&a->a7mpcore);
137
+ DeviceState *d = DEVICE(&a->cpu[i]);
138
139
irq = qdev_get_gpio_in(d, ARM_CPU_IRQ);
140
sysbus_connect_irq(sbd, i, irq);
141
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
142
}
143
144
/* SRAM */
145
- sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&s->cpu[0])->cpu_index);
146
+ sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&a->cpu[0])->cpu_index);
147
memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
148
if (err) {
149
error_propagate(errp, err);
150
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
151
}
152
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_DEV_I2C]);
153
for (i = 0; i < ASPEED_I2C_GET_CLASS(&s->i2c)->num_busses; i++) {
154
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore),
155
+ irq = qdev_get_gpio_in(DEVICE(&a->a7mpcore),
156
sc->irqmap[ASPEED_DEV_I2C] + i);
157
/* The AST2600 I2C controller has one IRQ per bus. */
158
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c.busses[i]), 0, irq);
159
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
160
* offset 0.
161
*/
162
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_1,
163
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
164
+ qdev_get_gpio_in(DEVICE(&a->a7mpcore),
165
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_1));
166
167
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_2,
168
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
169
+ qdev_get_gpio_in(DEVICE(&a->a7mpcore),
170
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_2));
171
172
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_3,
173
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
174
+ qdev_get_gpio_in(DEVICE(&a->a7mpcore),
175
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_3));
176
177
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_4,
178
- qdev_get_gpio_in(DEVICE(&s->a7mpcore),
179
+ qdev_get_gpio_in(DEVICE(&a->a7mpcore),
180
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_4));
181
182
/* HACE */
183
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
184
}
185
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->i3c), 0, sc->memmap[ASPEED_DEV_I3C]);
186
for (i = 0; i < ASPEED_I3C_NR_DEVICES; i++) {
187
- irq = qdev_get_gpio_in(DEVICE(&s->a7mpcore),
188
+ irq = qdev_get_gpio_in(DEVICE(&a->a7mpcore),
189
sc->irqmap[ASPEED_DEV_I3C] + i);
190
/* The AST2600 I3C controller has one IRQ per bus. */
191
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i3c.devices[i]), 0, irq);
192
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
193
index XXXXXXX..XXXXXXX 100644
194
--- a/hw/arm/fby35.c
195
+++ b/hw/arm/fby35.c
196
@@ -XXX,XX +XXX,XX @@ struct Fby35State {
197
MemoryRegion bic_memory;
198
Clock *bic_sysclk;
199
200
- AspeedSoCState bmc;
201
+ Aspeed2600SoCState bmc;
202
Aspeed10x0SoCState bic;
203
204
bool mmio_exec;
205
@@ -XXX,XX +XXX,XX @@ static void fby35_bmc_write_boot_rom(DriveInfo *dinfo, MemoryRegion *mr,
206
207
static void fby35_bmc_init(Fby35State *s)
208
{
209
+ AspeedSoCState *soc;
210
+
211
object_initialize_child(OBJECT(s), "bmc", &s->bmc, "ast2600-a3");
212
+ soc = ASPEED_SOC(&s->bmc);
213
214
memory_region_init(&s->bmc_memory, OBJECT(&s->bmc), "bmc-memory",
215
UINT64_MAX);
216
@@ -XXX,XX +XXX,XX @@ static void fby35_bmc_init(Fby35State *s)
217
&error_abort);
218
object_property_set_int(OBJECT(&s->bmc), "hw-strap2", 0x00000003,
219
&error_abort);
220
- aspeed_soc_uart_set_chr(&s->bmc, ASPEED_DEV_UART5, serial_hd(0));
221
+ aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART5, serial_hd(0));
222
qdev_realize(DEVICE(&s->bmc), NULL, &error_abort);
223
224
- aspeed_board_init_flashes(&s->bmc.fmc, "n25q00", 2, 0);
225
+ aspeed_board_init_flashes(&soc->fmc, "n25q00", 2, 0);
226
227
/* Install first FMC flash content as a boot rom. */
228
if (!s->mmio_exec) {
229
DriveInfo *mtd0 = drive_get(IF_MTD, 0, 0);
230
231
if (mtd0) {
232
- AspeedSoCState *bmc = &s->bmc;
233
- uint64_t rom_size = memory_region_size(&bmc->spi_boot);
234
+ uint64_t rom_size = memory_region_size(&soc->spi_boot);
235
236
memory_region_init_rom(&s->bmc_boot_rom, NULL, "aspeed.boot_rom",
237
rom_size, &error_abort);
238
- memory_region_add_subregion_overlap(&bmc->spi_boot_container, 0,
239
+ memory_region_add_subregion_overlap(&soc->spi_boot_container, 0,
240
&s->bmc_boot_rom, 1);
241
242
fby35_bmc_write_boot_rom(mtd0, &s->bmc_boot_rom,
52
--
243
--
53
2.35.1
244
2.41.0
54
245
55
246
diff view generated by jsdifflib
Deleted patch
1
From: Steven Lee <steven_lee@aspeedtech.com>
2
1
3
Per ast1030_v7.pdf, AST1030 ADC engine is identical to AST2600's ADC.
4
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Message-Id: <20220401083850.15266-2-jamin_lin@aspeedtech.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
include/hw/adc/aspeed_adc.h | 1 +
13
hw/adc/aspeed_adc.c | 16 ++++++++++++++++
14
2 files changed, 17 insertions(+)
15
16
diff --git a/include/hw/adc/aspeed_adc.h b/include/hw/adc/aspeed_adc.h
17
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/adc/aspeed_adc.h
19
+++ b/include/hw/adc/aspeed_adc.h
20
@@ -XXX,XX +XXX,XX @@
21
#define TYPE_ASPEED_2400_ADC TYPE_ASPEED_ADC "-ast2400"
22
#define TYPE_ASPEED_2500_ADC TYPE_ASPEED_ADC "-ast2500"
23
#define TYPE_ASPEED_2600_ADC TYPE_ASPEED_ADC "-ast2600"
24
+#define TYPE_ASPEED_1030_ADC TYPE_ASPEED_ADC "-ast1030"
25
OBJECT_DECLARE_TYPE(AspeedADCState, AspeedADCClass, ASPEED_ADC)
26
27
#define TYPE_ASPEED_ADC_ENGINE "aspeed.adc.engine"
28
diff --git a/hw/adc/aspeed_adc.c b/hw/adc/aspeed_adc.c
29
index XXXXXXX..XXXXXXX 100644
30
--- a/hw/adc/aspeed_adc.c
31
+++ b/hw/adc/aspeed_adc.c
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_adc_class_init(ObjectClass *klass, void *data)
33
aac->nr_engines = 2;
34
}
35
36
+static void aspeed_1030_adc_class_init(ObjectClass *klass, void *data)
37
+{
38
+ DeviceClass *dc = DEVICE_CLASS(klass);
39
+ AspeedADCClass *aac = ASPEED_ADC_CLASS(klass);
40
+
41
+ dc->desc = "ASPEED 1030 ADC Controller";
42
+ aac->nr_engines = 2;
43
+}
44
+
45
static const TypeInfo aspeed_adc_info = {
46
.name = TYPE_ASPEED_ADC,
47
.parent = TYPE_SYS_BUS_DEVICE,
48
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_2600_adc_info = {
49
.class_init = aspeed_2600_adc_class_init,
50
};
51
52
+static const TypeInfo aspeed_1030_adc_info = {
53
+ .name = TYPE_ASPEED_1030_ADC,
54
+ .parent = TYPE_ASPEED_ADC,
55
+ .class_init = aspeed_1030_adc_class_init, /* No change since AST2600 */
56
+};
57
+
58
static void aspeed_adc_register_types(void)
59
{
60
type_register_static(&aspeed_adc_engine_info);
61
@@ -XXX,XX +XXX,XX @@ static void aspeed_adc_register_types(void)
62
type_register_static(&aspeed_2400_adc_info);
63
type_register_static(&aspeed_2500_adc_info);
64
type_register_static(&aspeed_2600_adc_info);
65
+ type_register_static(&aspeed_1030_adc_info);
66
}
67
68
type_init(aspeed_adc_register_types);
69
--
70
2.35.1
71
72
diff view generated by jsdifflib
1
From: Steven Lee <steven_lee@aspeedtech.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The embedded core of AST1030 SoC is ARM Coretex M4.
3
The ARM array and VIC peripheral are only used by the
4
It is hard to be integrated in the common Aspeed Soc framework.
4
2400 series, remove them from the common AspeedSoCState.
5
We introduce a new ast1030 class with instance_init and realize
6
handlers.
7
5
8
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
10
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
[ clg: rename aspeed_ast10xx.c to aspeed_ast10x0.c to match zephyr ]
13
Message-Id: <20220401083850.15266-8-jamin_lin@aspeedtech.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
9
---
16
include/hw/arm/aspeed_soc.h | 3 +
10
include/hw/arm/aspeed_soc.h | 5 +++--
17
hw/arm/aspeed_ast10x0.c | 299 ++++++++++++++++++++++++++++++++++++
11
hw/arm/{aspeed_soc.c => aspeed_ast2400.c} | 27 +++++++++++++----------
18
hw/arm/meson.build | 6 +-
12
hw/arm/meson.build | 2 +-
19
3 files changed, 307 insertions(+), 1 deletion(-)
13
3 files changed, 19 insertions(+), 15 deletions(-)
20
create mode 100644 hw/arm/aspeed_ast10x0.c
14
rename hw/arm/{aspeed_soc.c => aspeed_ast2400.c} (95%)
21
15
22
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
16
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
23
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
24
--- a/include/hw/arm/aspeed_soc.h
18
--- a/include/hw/arm/aspeed_soc.h
25
+++ b/include/hw/arm/aspeed_soc.h
19
+++ b/include/hw/arm/aspeed_soc.h
26
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
27
#define ASPEED_SOC_H
21
struct AspeedSoCState {
28
22
DeviceState parent;
29
#include "hw/cpu/a15mpcore.h"
23
30
+#include "hw/arm/armv7m.h"
24
- ARMCPU cpu[ASPEED_CPUS_NUM];
31
#include "hw/intc/aspeed_vic.h"
25
MemoryRegion *memory;
32
#include "hw/misc/aspeed_scu.h"
33
#include "hw/adc/aspeed_adc.h"
34
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
35
/*< public >*/
36
ARMCPU cpu[ASPEED_CPUS_NUM];
37
A15MPPrivState a7mpcore;
38
+ ARMv7MState armv7m;
39
MemoryRegion *dram_mr;
26
MemoryRegion *dram_mr;
27
MemoryRegion dram_container;
40
MemoryRegion sram;
28
MemoryRegion sram;
41
AspeedVICState vic;
29
MemoryRegion spi_boot_container;
42
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
30
MemoryRegion spi_boot;
43
AspeedSDHCIState emmc;
31
- AspeedVICState vic;
44
AspeedLPCState lpc;
32
AspeedRtcState rtc;
45
uint32_t uart_default;
33
AspeedTimerCtrlState timerctrl;
46
+ Clock *sysclk;
34
AspeedI2CState i2c;
35
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
36
37
struct Aspeed2400SoCState {
38
AspeedSoCState parent;
39
+
40
+ ARMCPU cpu[ASPEED_CPUS_NUM];
41
+ AspeedVICState vic;
47
};
42
};
48
43
49
#define TYPE_ASPEED_SOC "aspeed-soc"
44
#define TYPE_ASPEED2400_SOC "aspeed2400-soc"
50
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
45
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_ast2400.c
51
new file mode 100644
46
similarity index 95%
52
index XXXXXXX..XXXXXXX
47
rename from hw/arm/aspeed_soc.c
53
--- /dev/null
48
rename to hw/arm/aspeed_ast2400.c
54
+++ b/hw/arm/aspeed_ast10x0.c
49
index XXXXXXX..XXXXXXX 100644
55
@@ -XXX,XX +XXX,XX @@
50
--- a/hw/arm/aspeed_soc.c
56
+/*
51
+++ b/hw/arm/aspeed_ast2400.c
57
+ * ASPEED Ast10x0 SoC
52
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2400_irqmap[] = {
58
+ *
53
59
+ * Copyright (C) 2022 ASPEED Technology Inc.
54
static qemu_irq aspeed_soc_ast2400_get_irq(AspeedSoCState *s, int dev)
60
+ *
55
{
61
+ * This code is licensed under the GPL version 2 or later. See
56
+ Aspeed2400SoCState *a = ASPEED2400_SOC(s);
62
+ * the COPYING file in the top-level directory.
57
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
63
+ *
58
64
+ * Implementation extracted from the AST2600 and adapted for Ast10x0.
59
- return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[dev]);
65
+ */
60
+ return qdev_get_gpio_in(DEVICE(&a->vic), sc->irqmap[dev]);
66
+
61
}
67
+#include "qemu/osdep.h"
62
68
+#include "qapi/error.h"
63
static void aspeed_ast2400_soc_init(Object *obj)
69
+#include "exec/address-spaces.h"
64
{
70
+#include "sysemu/sysemu.h"
65
+ Aspeed2400SoCState *a = ASPEED2400_SOC(obj);
71
+#include "hw/qdev-clock.h"
66
AspeedSoCState *s = ASPEED_SOC(obj);
72
+#include "hw/misc/unimp.h"
67
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
73
+#include "hw/char/serial.h"
68
int i;
74
+#include "hw/arm/aspeed_soc.h"
69
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
75
+
70
}
76
+#define ASPEED_SOC_IOMEM_SIZE 0x00200000
71
77
+
72
for (i = 0; i < sc->num_cpus; i++) {
78
+static const hwaddr aspeed_soc_ast1030_memmap[] = {
73
- object_initialize_child(obj, "cpu[*]", &s->cpu[i], sc->cpu_type);
79
+ [ASPEED_DEV_SRAM] = 0x00000000,
74
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
80
+ [ASPEED_DEV_SBC] = 0x79000000,
75
}
81
+ [ASPEED_DEV_IOMEM] = 0x7E600000,
76
82
+ [ASPEED_DEV_PWM] = 0x7E610000,
77
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
83
+ [ASPEED_DEV_FMC] = 0x7E620000,
78
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
84
+ [ASPEED_DEV_SPI1] = 0x7E630000,
79
object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu),
85
+ [ASPEED_DEV_SPI2] = 0x7E640000,
80
"hw-prot-key");
86
+ [ASPEED_DEV_SCU] = 0x7E6E2000,
81
87
+ [ASPEED_DEV_ADC] = 0x7E6E9000,
82
- object_initialize_child(obj, "vic", &s->vic, TYPE_ASPEED_VIC);
88
+ [ASPEED_DEV_SBC] = 0x7E6F2000,
83
+ object_initialize_child(obj, "vic", &a->vic, TYPE_ASPEED_VIC);
89
+ [ASPEED_DEV_GPIO] = 0x7E780000,
84
90
+ [ASPEED_DEV_TIMER1] = 0x7E782000,
85
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
91
+ [ASPEED_DEV_UART5] = 0x7E784000,
86
92
+ [ASPEED_DEV_WDT] = 0x7E785000,
87
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
93
+ [ASPEED_DEV_LPC] = 0x7E789000,
88
static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
94
+ [ASPEED_DEV_I2C] = 0x7E7B0000,
89
{
95
+};
90
int i;
96
+
91
+ Aspeed2400SoCState *a = ASPEED2400_SOC(dev);
97
+static const int aspeed_soc_ast1030_irqmap[] = {
92
AspeedSoCState *s = ASPEED_SOC(dev);
98
+ [ASPEED_DEV_UART5] = 8,
93
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
99
+ [ASPEED_DEV_GPIO] = 11,
94
Error *err = NULL;
100
+ [ASPEED_DEV_TIMER1] = 16,
95
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
101
+ [ASPEED_DEV_TIMER2] = 17,
96
102
+ [ASPEED_DEV_TIMER3] = 18,
97
/* CPU */
103
+ [ASPEED_DEV_TIMER4] = 19,
98
for (i = 0; i < sc->num_cpus; i++) {
104
+ [ASPEED_DEV_TIMER5] = 20,
99
- object_property_set_link(OBJECT(&s->cpu[i]), "memory",
105
+ [ASPEED_DEV_TIMER6] = 21,
100
+ object_property_set_link(OBJECT(&a->cpu[i]), "memory",
106
+ [ASPEED_DEV_TIMER7] = 22,
101
OBJECT(s->memory), &error_abort);
107
+ [ASPEED_DEV_TIMER8] = 23,
102
- if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
108
+ [ASPEED_DEV_WDT] = 24,
103
+ if (!qdev_realize(DEVICE(&a->cpu[i]), NULL, errp)) {
109
+ [ASPEED_DEV_LPC] = 35,
104
return;
110
+ [ASPEED_DEV_FMC] = 39,
105
}
111
+ [ASPEED_DEV_PWM] = 44,
106
}
112
+ [ASPEED_DEV_ADC] = 46,
107
113
+ [ASPEED_DEV_SPI1] = 65,
108
/* SRAM */
114
+ [ASPEED_DEV_SPI2] = 66,
109
- sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&s->cpu[0])->cpu_index);
115
+ [ASPEED_DEV_I2C] = 110, /* 110 ~ 123 */
110
+ sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&a->cpu[0])->cpu_index);
116
+ [ASPEED_DEV_KCS] = 138, /* 138 -> 142 */
111
memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
117
+};
112
if (err) {
118
+
113
error_propagate(errp, err);
119
+static qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int ctrl)
114
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
120
+{
115
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_DEV_SCU]);
121
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
116
122
+
117
/* VIC */
123
+ return qdev_get_gpio_in(DEVICE(&s->armv7m), sc->irqmap[ctrl]);
118
- if (!sysbus_realize(SYS_BUS_DEVICE(&s->vic), errp)) {
124
+}
119
+ if (!sysbus_realize(SYS_BUS_DEVICE(&a->vic), errp)) {
125
+
120
return;
126
+static void aspeed_soc_ast1030_init(Object *obj)
121
}
127
+{
122
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_DEV_VIC]);
128
+ AspeedSoCState *s = ASPEED_SOC(obj);
123
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0,
129
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
124
- qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
130
+ char socname[8];
125
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1,
131
+ char typename[64];
126
- qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
132
+ int i;
127
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&a->vic), 0, sc->memmap[ASPEED_DEV_VIC]);
133
+
128
+ sysbus_connect_irq(SYS_BUS_DEVICE(&a->vic), 0,
134
+ if (sscanf(sc->name, "%7s", socname) != 1) {
129
+ qdev_get_gpio_in(DEVICE(&a->cpu), ARM_CPU_IRQ));
135
+ g_assert_not_reached();
130
+ sysbus_connect_irq(SYS_BUS_DEVICE(&a->vic), 1,
136
+ }
131
+ qdev_get_gpio_in(DEVICE(&a->cpu), ARM_CPU_FIQ));
137
+
132
138
+ object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
133
/* RTC */
139
+
134
if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
140
+ s->sysclk = qdev_init_clock_in(DEVICE(s), "sysclk", NULL, NULL, 0);
141
+
142
+ snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
143
+ object_initialize_child(obj, "scu", &s->scu, typename);
144
+ qdev_prop_set_uint32(DEVICE(&s->scu), "silicon-rev", sc->silicon_rev);
145
+
146
+ object_property_add_alias(obj, "hw-strap1", OBJECT(&s->scu), "hw-strap1");
147
+ object_property_add_alias(obj, "hw-strap2", OBJECT(&s->scu), "hw-strap2");
148
+
149
+ snprintf(typename, sizeof(typename), "aspeed.timer-%s", socname);
150
+ object_initialize_child(obj, "timerctrl", &s->timerctrl, typename);
151
+
152
+ snprintf(typename, sizeof(typename), "aspeed.adc-%s", socname);
153
+ object_initialize_child(obj, "adc", &s->adc, typename);
154
+
155
+ snprintf(typename, sizeof(typename), "aspeed.fmc-%s", socname);
156
+ object_initialize_child(obj, "fmc", &s->fmc, typename);
157
+
158
+ for (i = 0; i < sc->spis_num; i++) {
159
+ snprintf(typename, sizeof(typename), "aspeed.spi%d-%s", i + 1, socname);
160
+ object_initialize_child(obj, "spi[*]", &s->spi[i], typename);
161
+ }
162
+
163
+ object_initialize_child(obj, "lpc", &s->lpc, TYPE_ASPEED_LPC);
164
+
165
+ object_initialize_child(obj, "sbc", &s->sbc, TYPE_ASPEED_SBC);
166
+
167
+ for (i = 0; i < sc->wdts_num; i++) {
168
+ snprintf(typename, sizeof(typename), "aspeed.wdt-%s", socname);
169
+ object_initialize_child(obj, "wdt[*]", &s->wdt[i], typename);
170
+ }
171
+}
172
+
173
+static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
174
+{
175
+ AspeedSoCState *s = ASPEED_SOC(dev_soc);
176
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
177
+ MemoryRegion *system_memory = get_system_memory();
178
+ DeviceState *armv7m;
179
+ Error *err = NULL;
180
+ int i;
181
+
182
+ if (!clock_has_source(s->sysclk)) {
183
+ error_setg(errp, "sysclk clock must be wired up by the board code");
184
+ return;
185
+ }
186
+
187
+ /* General I/O memory space to catch all unimplemented device */
188
+ create_unimplemented_device("aspeed.sbc",
189
+ sc->memmap[ASPEED_DEV_SBC],
190
+ 0x40000);
191
+ create_unimplemented_device("aspeed.io",
192
+ sc->memmap[ASPEED_DEV_IOMEM],
193
+ ASPEED_SOC_IOMEM_SIZE);
194
+
195
+ /* AST1030 CPU Core */
196
+ armv7m = DEVICE(&s->armv7m);
197
+ qdev_prop_set_uint32(armv7m, "num-irq", 256);
198
+ qdev_prop_set_string(armv7m, "cpu-type", sc->cpu_type);
199
+ qdev_connect_clock_in(armv7m, "cpuclk", s->sysclk);
200
+ object_property_set_link(OBJECT(&s->armv7m), "memory",
201
+ OBJECT(system_memory), &error_abort);
202
+ sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &error_abort);
203
+
204
+ /* Internal SRAM */
205
+ memory_region_init_ram(&s->sram, NULL, "aspeed.sram", sc->sram_size, &err);
206
+ if (err != NULL) {
207
+ error_propagate(errp, err);
208
+ return;
209
+ }
210
+ memory_region_add_subregion(system_memory,
211
+ sc->memmap[ASPEED_DEV_SRAM],
212
+ &s->sram);
213
+
214
+ /* SCU */
215
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->scu), errp)) {
216
+ return;
217
+ }
218
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_DEV_SCU]);
219
+
220
+ /* LPC */
221
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->lpc), errp)) {
222
+ return;
223
+ }
224
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->lpc), 0, sc->memmap[ASPEED_DEV_LPC]);
225
+
226
+ /* Connect the LPC IRQ to the GIC. It is otherwise unused. */
227
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 0,
228
+ aspeed_soc_get_irq(s, ASPEED_DEV_LPC));
229
+
230
+ /*
231
+ * On the AST1030 LPC subdevice IRQs are connected straight to the GIC.
232
+ */
233
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_1,
234
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
235
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_1));
236
+
237
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_2,
238
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
239
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_2));
240
+
241
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_3,
242
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
243
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_3));
244
+
245
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_4,
246
+ qdev_get_gpio_in(DEVICE(&s->armv7m),
247
+ sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_4));
248
+
249
+ /* UART5 - attach an 8250 to the IO space as our UART */
250
+ serial_mm_init(get_system_memory(), sc->memmap[ASPEED_DEV_UART5], 2,
251
+ aspeed_soc_get_irq(s, ASPEED_DEV_UART5),
252
+ 38400, serial_hd(0), DEVICE_LITTLE_ENDIAN);
253
+
254
+ /* Timer */
255
+ object_property_set_link(OBJECT(&s->timerctrl), "scu", OBJECT(&s->scu),
256
+ &error_abort);
257
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->timerctrl), errp)) {
258
+ return;
259
+ }
260
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->timerctrl), 0,
261
+ sc->memmap[ASPEED_DEV_TIMER1]);
262
+ for (i = 0; i < ASPEED_TIMER_NR_TIMERS; i++) {
263
+ qemu_irq irq = aspeed_soc_get_irq(s, ASPEED_DEV_TIMER1 + i);
264
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->timerctrl), i, irq);
265
+ }
266
+
267
+ /* ADC */
268
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->adc), errp)) {
269
+ return;
270
+ }
271
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->adc), 0, sc->memmap[ASPEED_DEV_ADC]);
272
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->adc), 0,
273
+ aspeed_soc_get_irq(s, ASPEED_DEV_ADC));
274
+
275
+ /* FMC, The number of CS is set at the board level */
276
+ object_property_set_link(OBJECT(&s->fmc), "dram", OBJECT(&s->sram),
277
+ &error_abort);
278
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->fmc), errp)) {
279
+ return;
280
+ }
281
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 0, sc->memmap[ASPEED_DEV_FMC]);
282
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->fmc), 1,
283
+ ASPEED_SMC_GET_CLASS(&s->fmc)->flash_window_base);
284
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->fmc), 0,
285
+ aspeed_soc_get_irq(s, ASPEED_DEV_FMC));
286
+
287
+ /* SPI */
288
+ for (i = 0; i < sc->spis_num; i++) {
289
+ object_property_set_link(OBJECT(&s->spi[i]), "dram",
290
+ OBJECT(&s->sram), &error_abort);
291
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->spi[i]), errp)) {
292
+ return;
293
+ }
294
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 0,
295
+ sc->memmap[ASPEED_DEV_SPI1 + i]);
296
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->spi[i]), 1,
297
+ ASPEED_SMC_GET_CLASS(&s->spi[i])->flash_window_base);
298
+ }
299
+
300
+ /* Secure Boot Controller */
301
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->sbc), errp)) {
302
+ return;
303
+ }
304
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->sbc), 0, sc->memmap[ASPEED_DEV_SBC]);
305
+
306
+ /* Watch dog */
307
+ for (i = 0; i < sc->wdts_num; i++) {
308
+ AspeedWDTClass *awc = ASPEED_WDT_GET_CLASS(&s->wdt[i]);
309
+
310
+ object_property_set_link(OBJECT(&s->wdt[i]), "scu", OBJECT(&s->scu),
311
+ &error_abort);
312
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->wdt[i]), errp)) {
313
+ return;
314
+ }
315
+ sysbus_mmio_map(SYS_BUS_DEVICE(&s->wdt[i]), 0,
316
+ sc->memmap[ASPEED_DEV_WDT] + i * awc->offset);
317
+ }
318
+}
319
+
320
+static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
321
+{
322
+ DeviceClass *dc = DEVICE_CLASS(klass);
323
+ AspeedSoCClass *sc = ASPEED_SOC_CLASS(dc);
324
+
325
+ dc->realize = aspeed_soc_ast1030_realize;
326
+
327
+ sc->name = "ast1030-a1";
328
+ sc->cpu_type = ARM_CPU_TYPE_NAME("cortex-m4");
329
+ sc->silicon_rev = AST1030_A1_SILICON_REV;
330
+ sc->sram_size = 0xc0000;
331
+ sc->spis_num = 2;
332
+ sc->ehcis_num = 0;
333
+ sc->wdts_num = 4;
334
+ sc->macs_num = 1;
335
+ sc->irqmap = aspeed_soc_ast1030_irqmap;
336
+ sc->memmap = aspeed_soc_ast1030_memmap;
337
+ sc->num_cpus = 1;
338
+}
339
+
340
+static const TypeInfo aspeed_soc_ast1030_type_info = {
341
+ .name = "ast1030-a1",
342
+ .parent = TYPE_ASPEED_SOC,
343
+ .instance_size = sizeof(AspeedSoCState),
344
+ .instance_init = aspeed_soc_ast1030_init,
345
+ .class_init = aspeed_soc_ast1030_class_init,
346
+ .class_size = sizeof(AspeedSoCClass),
347
+};
348
+
349
+static void aspeed_soc_register_types(void)
350
+{
351
+ type_register_static(&aspeed_soc_ast1030_type_info);
352
+}
353
+
354
+type_init(aspeed_soc_register_types)
355
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
135
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
356
index XXXXXXX..XXXXXXX 100644
136
index XXXXXXX..XXXXXXX 100644
357
--- a/hw/arm/meson.build
137
--- a/hw/arm/meson.build
358
+++ b/hw/arm/meson.build
138
+++ b/hw/arm/meson.build
359
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_XLNX_VERSAL', if_true: files('xlnx-versal.c', 'xlnx-ver
139
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_FSL_IMX25', if_true: files('fsl-imx25.c', 'imx25_pdk.c'
360
arm_ss.add(when: 'CONFIG_FSL_IMX25', if_true: files('fsl-imx25.c', 'imx25_pdk.c'))
361
arm_ss.add(when: 'CONFIG_FSL_IMX31', if_true: files('fsl-imx31.c', 'kzm.c'))
140
arm_ss.add(when: 'CONFIG_FSL_IMX31', if_true: files('fsl-imx31.c', 'kzm.c'))
362
arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
141
arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
363
-arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files('aspeed_soc.c', 'aspeed.c', 'aspeed_ast2600.c'))
142
arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
364
+arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
143
- 'aspeed_soc.c',
365
+ 'aspeed_soc.c',
144
'aspeed.c',
366
+ 'aspeed.c',
145
'aspeed_soc_common.c',
367
+ 'aspeed_ast2600.c',
146
+ 'aspeed_ast2400.c',
368
+ 'aspeed_ast10x0.c'))
147
'aspeed_ast2600.c',
369
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2.c'))
148
'aspeed_ast10x0.c',
370
arm_ss.add(when: 'CONFIG_MPS2', if_true: files('mps2-tz.c'))
149
'aspeed_eeprom.c',
371
arm_ss.add(when: 'CONFIG_MSF2', if_true: files('msf2-soc.c'))
372
--
150
--
373
2.35.1
151
2.41.0
374
152
375
153
diff view generated by jsdifflib
Deleted patch
1
From: Jamin Lin <jamin_lin@aspeedtech.com>
2
1
3
Add test case to test "ast1030-evb" machine with zephyr os
4
5
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
6
Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
7
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Message-Id: <20220401083850.15266-10-jamin_lin@aspeedtech.com>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
tests/avocado/machine_aspeed.py | 36 +++++++++++++++++++++++++++++++++
13
1 file changed, 36 insertions(+)
14
create mode 100644 tests/avocado/machine_aspeed.py
15
16
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/tests/avocado/machine_aspeed.py
21
@@ -XXX,XX +XXX,XX @@
22
+# Functional test that boots the ASPEED SoCs with firmware
23
+#
24
+# Copyright (C) 2022 ASPEED Technology Inc
25
+#
26
+# This work is licensed under the terms of the GNU GPL, version 2 or
27
+# later. See the COPYING file in the top-level directory.
28
+
29
+from avocado_qemu import QemuSystemTest
30
+from avocado_qemu import wait_for_console_pattern
31
+from avocado_qemu import exec_command_and_wait_for_pattern
32
+from avocado.utils import archive
33
+
34
+
35
+class AST1030Machine(QemuSystemTest):
36
+ """Boots the zephyr os and checks that the console is operational"""
37
+
38
+ timeout = 10
39
+
40
+ def test_ast1030_zephyros(self):
41
+ """
42
+ :avocado: tags=arch:arm
43
+ :avocado: tags=machine:ast1030-evb
44
+ """
45
+ tar_url = ('https://github.com/AspeedTech-BMC'
46
+ '/zephyr/releases/download/v00.01.04/ast1030-evb-demo.zip')
47
+ tar_hash = '4c6a8ce3a8ba76ef1a65dae419ae3409343c4b20'
48
+ tar_path = self.fetch_asset(tar_url, asset_hash=tar_hash)
49
+ archive.extract(tar_path, self.workdir)
50
+ kernel_file = self.workdir + "/ast1030-evb-demo/zephyr.elf"
51
+ self.vm.set_console()
52
+ self.vm.add_args('-kernel', kernel_file,
53
+ '-nographic')
54
+ self.vm.launch()
55
+ wait_for_console_pattern(self, "Booting Zephyr OS")
56
+ exec_command_and_wait_for_pattern(self, "help",
57
+ "Available commands")
58
--
59
2.35.1
60
61
diff view generated by jsdifflib
Deleted patch
1
From: Jae Hyun Yoo <quic_jaehyoo@quicinc.com>
2
1
3
Current fmc model of AST2500 EVB and AST2600 EVB can't emulate quad
4
mode properly so fix them using equivalent mx25l25635e and mx66u51235f
5
respectively.
6
7
These default settings still can be overridden using the 'fmc-model'
8
command line option.
9
10
Reported-by: Graeme Gregory <quic_ggregory@quicinc.com>
11
Signed-off-by: Jae Hyun Yoo <quic_jaehyoo@quicinc.com>
12
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Message-Id: <20220402184427.4010304-1-quic_jaehyoo@quicinc.com>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
16
hw/arm/aspeed.c | 4 ++--
17
1 file changed, 2 insertions(+), 2 deletions(-)
18
19
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
20
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/aspeed.c
22
+++ b/hw/arm/aspeed.c
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
24
mc->desc = "Aspeed AST2500 EVB (ARM1176)";
25
amc->soc_name = "ast2500-a1";
26
amc->hw_strap1 = AST2500_EVB_HW_STRAP1;
27
- amc->fmc_model = "w25q256";
28
+ amc->fmc_model = "mx25l25635e";
29
amc->spi_model = "mx25l25635e";
30
amc->num_cs = 1;
31
amc->i2c_init = ast2500_evb_i2c_init;
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
33
amc->soc_name = "ast2600-a3";
34
amc->hw_strap1 = AST2600_EVB_HW_STRAP1;
35
amc->hw_strap2 = AST2600_EVB_HW_STRAP2;
36
- amc->fmc_model = "w25q512jv";
37
+ amc->fmc_model = "mx66u51235f";
38
amc->spi_model = "mx66u51235f";
39
amc->num_cs = 1;
40
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON | ASPEED_MAC2_ON |
41
--
42
2.35.1
43
44
diff view generated by jsdifflib
Deleted patch
1
From: Steven Lee <steven_lee@aspeedtech.com>
2
1
3
This add two addition test cases for accumulative mode under sg enabled.
4
5
The input vector was manually craft with "abc" + bit 1 + padding zeros + L.
6
The padding length depends on algorithm, i.e. SHA512 (1024 bit),
7
SHA256 (512 bit).
8
9
The result was calculated by command line sha512sum/sha256sum utilities
10
without padding, i.e. only "abc" ascii text.
11
12
Signed-off-by: Troy Lee <troy_lee@aspeedtech.com>
13
Signed-off-by: Steven Lee <steven_lee@aspeedtech.com>
14
Acked-by: Thomas Huth <thuth@redhat.com>
15
Reviewed-by: Joel Stanley <joel@jms.id.au>
16
[ clg: checkpatch fixes ]
17
Message-Id: <20220426021120.28255-4-steven_lee@aspeedtech.com>
18
Signed-off-by: Cédric Le Goater <clg@kaod.org>
19
---
20
tests/qtest/aspeed_hace-test.c | 147 +++++++++++++++++++++++++++++++++
21
1 file changed, 147 insertions(+)
22
23
diff --git a/tests/qtest/aspeed_hace-test.c b/tests/qtest/aspeed_hace-test.c
24
index XXXXXXX..XXXXXXX 100644
25
--- a/tests/qtest/aspeed_hace-test.c
26
+++ b/tests/qtest/aspeed_hace-test.c
27
@@ -XXX,XX +XXX,XX @@
28
#define HACE_ALGO_SHA512 (BIT(5) | BIT(6))
29
#define HACE_ALGO_SHA384 (BIT(5) | BIT(6) | BIT(10))
30
#define HACE_SG_EN BIT(18)
31
+#define HACE_ACCUM_EN BIT(8)
32
33
#define HACE_STS 0x1c
34
#define HACE_RSA_ISR BIT(13)
35
@@ -XXX,XX +XXX,XX @@ static const uint8_t test_result_sg_sha256[] = {
36
0x55, 0x1e, 0x1e, 0xc5, 0x80, 0xdd, 0x6d, 0x5a, 0x6e, 0xcd, 0xe9, 0xf3,
37
0xd3, 0x5e, 0x6e, 0x4a, 0x71, 0x7f, 0xbd, 0xe4};
38
39
+/*
40
+ * The accumulative mode requires firmware to provide internal initial state
41
+ * and message padding (including length L at the end of padding).
42
+ *
43
+ * This test vector is a ascii text "abc" with padding message.
44
+ *
45
+ * Expected results were generated using command line utitiles:
46
+ *
47
+ * echo -n -e 'abc' | dd of=/tmp/test
48
+ * for hash in sha512sum sha256sum; do $hash /tmp/test; done
49
+ */
50
+static const uint8_t test_vector_accum_512[] = {
51
+ 0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
52
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
54
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
61
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
62
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
65
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
67
+
68
+static const uint8_t test_vector_accum_256[] = {
69
+ 0x61, 0x62, 0x63, 0x80, 0x00, 0x00, 0x00, 0x00,
70
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
73
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
74
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
75
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
76
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18};
77
+
78
+static const uint8_t test_result_accum_sha512[] = {
79
+ 0xdd, 0xaf, 0x35, 0xa1, 0x93, 0x61, 0x7a, 0xba, 0xcc, 0x41, 0x73, 0x49,
80
+ 0xae, 0x20, 0x41, 0x31, 0x12, 0xe6, 0xfa, 0x4e, 0x89, 0xa9, 0x7e, 0xa2,
81
+ 0x0a, 0x9e, 0xee, 0xe6, 0x4b, 0x55, 0xd3, 0x9a, 0x21, 0x92, 0x99, 0x2a,
82
+ 0x27, 0x4f, 0xc1, 0xa8, 0x36, 0xba, 0x3c, 0x23, 0xa3, 0xfe, 0xeb, 0xbd,
83
+ 0x45, 0x4d, 0x44, 0x23, 0x64, 0x3c, 0xe8, 0x0e, 0x2a, 0x9a, 0xc9, 0x4f,
84
+ 0xa5, 0x4c, 0xa4, 0x9f};
85
+
86
+static const uint8_t test_result_accum_sha256[] = {
87
+ 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40, 0xde,
88
+ 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17, 0x7a, 0x9c,
89
+ 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad};
90
91
static void write_regs(QTestState *s, uint32_t base, uint32_t src,
92
uint32_t length, uint32_t out, uint32_t method)
93
@@ -XXX,XX +XXX,XX @@ static void test_sha512_sg(const char *machine, const uint32_t base,
94
qtest_quit(s);
95
}
96
97
+static void test_sha256_accum(const char *machine, const uint32_t base,
98
+ const uint32_t src_addr)
99
+{
100
+ QTestState *s = qtest_init(machine);
101
+
102
+ const uint32_t buffer_addr = src_addr + 0x1000000;
103
+ const uint32_t digest_addr = src_addr + 0x4000000;
104
+ uint8_t digest[32] = {0};
105
+ struct AspeedSgList array[] = {
106
+ { cpu_to_le32(sizeof(test_vector_accum_256) | SG_LIST_LEN_LAST),
107
+ cpu_to_le32(buffer_addr) },
108
+ };
109
+
110
+ /* Check engine is idle, no busy or irq bits set */
111
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
112
+
113
+ /* Write test vector into memory */
114
+ qtest_memwrite(s, buffer_addr, test_vector_accum_256,
115
+ sizeof(test_vector_accum_256));
116
+ qtest_memwrite(s, src_addr, array, sizeof(array));
117
+
118
+ write_regs(s, base, src_addr, sizeof(test_vector_accum_256),
119
+ digest_addr, HACE_ALGO_SHA256 | HACE_SG_EN | HACE_ACCUM_EN);
120
+
121
+ /* Check hash IRQ status is asserted */
122
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
123
+
124
+ /* Clear IRQ status and check status is deasserted */
125
+ qtest_writel(s, base + HACE_STS, 0x00000200);
126
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
127
+
128
+ /* Read computed digest from memory */
129
+ qtest_memread(s, digest_addr, digest, sizeof(digest));
130
+
131
+ /* Check result of computation */
132
+ g_assert_cmpmem(digest, sizeof(digest),
133
+ test_result_accum_sha256, sizeof(digest));
134
+
135
+ qtest_quit(s);
136
+}
137
+
138
+static void test_sha512_accum(const char *machine, const uint32_t base,
139
+ const uint32_t src_addr)
140
+{
141
+ QTestState *s = qtest_init(machine);
142
+
143
+ const uint32_t buffer_addr = src_addr + 0x1000000;
144
+ const uint32_t digest_addr = src_addr + 0x4000000;
145
+ uint8_t digest[64] = {0};
146
+ struct AspeedSgList array[] = {
147
+ { cpu_to_le32(sizeof(test_vector_accum_512) | SG_LIST_LEN_LAST),
148
+ cpu_to_le32(buffer_addr) },
149
+ };
150
+
151
+ /* Check engine is idle, no busy or irq bits set */
152
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
153
+
154
+ /* Write test vector into memory */
155
+ qtest_memwrite(s, buffer_addr, test_vector_accum_512,
156
+ sizeof(test_vector_accum_512));
157
+ qtest_memwrite(s, src_addr, array, sizeof(array));
158
+
159
+ write_regs(s, base, src_addr, sizeof(test_vector_accum_512),
160
+ digest_addr, HACE_ALGO_SHA512 | HACE_SG_EN | HACE_ACCUM_EN);
161
+
162
+ /* Check hash IRQ status is asserted */
163
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0x00000200);
164
+
165
+ /* Clear IRQ status and check status is deasserted */
166
+ qtest_writel(s, base + HACE_STS, 0x00000200);
167
+ g_assert_cmphex(qtest_readl(s, base + HACE_STS), ==, 0);
168
+
169
+ /* Read computed digest from memory */
170
+ qtest_memread(s, digest_addr, digest, sizeof(digest));
171
+
172
+ /* Check result of computation */
173
+ g_assert_cmpmem(digest, sizeof(digest),
174
+ test_result_accum_sha512, sizeof(digest));
175
+
176
+ qtest_quit(s);
177
+}
178
+
179
struct masks {
180
uint32_t src;
181
uint32_t dest;
182
@@ -XXX,XX +XXX,XX @@ static void test_sha512_sg_ast2600(void)
183
test_sha512_sg("-machine ast2600-evb", 0x1e6d0000, 0x80000000);
184
}
185
186
+static void test_sha256_accum_ast2600(void)
187
+{
188
+ test_sha256_accum("-machine ast2600-evb", 0x1e6d0000, 0x80000000);
189
+}
190
+
191
+static void test_sha512_accum_ast2600(void)
192
+{
193
+ test_sha512_accum("-machine ast2600-evb", 0x1e6d0000, 0x80000000);
194
+}
195
+
196
static void test_addresses_ast2600(void)
197
{
198
test_addresses("-machine ast2600-evb", 0x1e6d0000, &ast2600_masks);
199
@@ -XXX,XX +XXX,XX @@ int main(int argc, char **argv)
200
qtest_add_func("ast2600/hace/sha512_sg", test_sha512_sg_ast2600);
201
qtest_add_func("ast2600/hace/sha256_sg", test_sha256_sg_ast2600);
202
203
+ qtest_add_func("ast2600/hace/sha512_accum", test_sha512_accum_ast2600);
204
+ qtest_add_func("ast2600/hace/sha256_accum", test_sha256_accum_ast2600);
205
+
206
qtest_add_func("ast2500/hace/addresses", test_addresses_ast2500);
207
qtest_add_func("ast2500/hace/sha512", test_sha512_ast2500);
208
qtest_add_func("ast2500/hace/sha256", test_sha256_ast2500);
209
--
210
2.35.1
211
212
diff view generated by jsdifflib