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 |