1
The following changes since commit 2f4c51c0f384d7888a04b4815861e6d5fd244d75:
1
The following changes since commit a95260486aa7e78d7c7194eba65cf03311ad94ad:
2
2
3
Merge remote-tracking branch 'remotes/kraxel/tags/usb-20200831-pull-request' into staging (2020-08-31 19:39:13 +0100)
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-20200901
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20231025
8
8
9
for you to fetch changes up to ddd8ab19749b8639fc08bfe4d0df0204eec049f0:
9
for you to fetch changes up to dd41ce7a6f13ad4f45ebaf52b9fa91fe5fc961df:
10
10
11
hw: add a number of SPI-flash's of m25p80 family (2020-09-01 14:21:51 +0200)
11
hw/arm/aspeed: Move AspeedSoCState::cpu/vic to Aspeed2400SoCState (2023-10-25 09:52:44 +0200)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
Various fixes of Aspeed machines :
14
aspeed queue:
15
15
16
* New Supermicro X11 BMC machine (Erik)
16
* Update of Andrew's email
17
* Fixed valid access size on AST2400 SCU
17
* Split of AspeedSoCState per 2400/2600/10x0
18
* Improved robustness of the ftgmac100 model.
19
* New flash models in m25p80 (Igor)
20
* Fixed reset sequence of SDHCI/eMMC controllers
21
* Improved support of the AST2600 SDMC (Joel)
22
* Couple of SMC cleanups
23
18
24
----------------------------------------------------------------
19
----------------------------------------------------------------
25
Cédric Le Goater (15):
20
Andrew Jeffery (1):
26
m25p80: Return the JEDEC ID twice for mx25l25635e
21
MAINTAINERS: aspeed: Update Andrew's email address
27
m25p80: Add support for n25q512ax3
28
aspeed/scu: Fix valid access size on AST2400
29
aspeed/smc: Fix MemoryRegionOps definition
30
aspeed/smc: Fix max_slaves of the legacy SMC device
31
aspeed/sdhci: Fix reset sequence
32
ftgmac100: Fix registers that can be read
33
ftgmac100: Fix interrupt status "Packet transmitted on ethernet"
34
ftgmac100: Fix interrupt status "Packet moved to RX FIFO"
35
ftgmac100: Change interrupt status when a DMA error occurs
36
ftgmac100: Check for invalid len and address before doing a DMA transfer
37
ftgmac100: Fix integer overflow in ftgmac100_do_tx()
38
ftgmac100: Improve software reset
39
aspeed/sdmc: Simplify calculation of RAM bits
40
aspeed/smc: Open AHB window of the second chip of the AST2600 FMC controller
41
22
42
Erik Smit (1):
23
Philippe Mathieu-Daudé (11):
43
hw/arm/aspeed: Add board model for Supermicro X11 BMC
24
hw/arm/aspeed: Extract code common to all boards to a common file
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
44
35
45
Igor Kononenko (2):
36
MAINTAINERS | 2 +-
46
arm: aspeed: add strap define `25HZ` of AST2500
37
include/hw/arm/aspeed_soc.h | 35 +++++-
47
hw: add a number of SPI-flash's of m25p80 family
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
48
48
49
Joel Stanley (2):
50
aspeed/sdmc: Perform memory training
51
aspeed/sdmc: Allow writes to unprotected registers
52
53
include/hw/misc/aspeed_scu.h | 1 +
54
include/hw/misc/aspeed_sdmc.h | 13 ++++-
55
hw/arm/aspeed.c | 35 ++++++++++++
56
hw/block/m25p80.c | 5 +-
57
hw/misc/aspeed_scu.c | 9 +--
58
hw/misc/aspeed_sdmc.c | 125 +++++++++++++++++++++++-------------------
59
hw/net/ftgmac100.c | 95 +++++++++++++++++++++++---------
60
hw/sd/aspeed_sdhci.c | 14 ++++-
61
hw/ssi/aspeed_smc.c | 6 +-
62
9 files changed, 208 insertions(+), 95 deletions(-)
63
diff view generated by jsdifflib
Deleted patch
1
The mx25l25635e returns the JEDEC ID twice when issuing a RDID command :
2
1
3
[ 2.512027] aspeed-smc 1e630000.spi: reading JEDEC ID C2:20:19:C2:20:19
4
5
This can break some firmware testing for this condition on the
6
supermicrox11-bmc machine.
7
8
Reported-by: Erik Smit <erik.lucas.smit@gmail.com>
9
Message-Id: <20200819100956.2216690-2-clg@kaod.org>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
12
hw/block/m25p80.c | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
14
15
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
16
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/block/m25p80.c
18
+++ b/hw/block/m25p80.c
19
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
20
{ INFO("mx25l6405d", 0xc22017, 0, 64 << 10, 128, 0) },
21
{ INFO("mx25l12805d", 0xc22018, 0, 64 << 10, 256, 0) },
22
{ INFO("mx25l12855e", 0xc22618, 0, 64 << 10, 256, 0) },
23
- { INFO("mx25l25635e", 0xc22019, 0, 64 << 10, 512, 0) },
24
+ { INFO6("mx25l25635e", 0xc22019, 0xc22019, 64 << 10, 512, 0) },
25
{ INFO("mx25l25655e", 0xc22619, 0, 64 << 10, 512, 0) },
26
{ INFO("mx66u51235f", 0xc2253a, 0, 64 << 10, 1024, ER_4K | ER_32K) },
27
{ INFO("mx66u1g45g", 0xc2253b, 0, 64 << 10, 2048, ER_4K | ER_32K) },
28
--
29
2.25.4
30
31
diff view generated by jsdifflib
Deleted patch
1
Datasheet available here :
2
1
3
https://www.micron.com/-/media/client/global/Documents/Products/Data%20Sheet/NOR%20Flash/Serial%20NOR/N25Q/n25q_512mb_1ce_3v_65nm.pdf
4
5
Reviewed-by: Joel Stanley <joel@jms.id.au>
6
Message-Id: <20200819100956.2216690-4-clg@kaod.org>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
9
hw/block/m25p80.c | 1 +
10
1 file changed, 1 insertion(+)
11
12
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/block/m25p80.c
15
+++ b/hw/block/m25p80.c
16
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
17
{ INFO("n25q128", 0x20ba18, 0, 64 << 10, 256, 0) },
18
{ INFO("n25q256a", 0x20ba19, 0, 64 << 10, 512, ER_4K) },
19
{ INFO("n25q512a", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
20
+ { INFO("n25q512ax3", 0x20ba20, 0x1000, 64 << 10, 1024, ER_4K) },
21
{ INFO_STACKED("n25q00", 0x20ba21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
22
{ INFO_STACKED("n25q00a", 0x20bb21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
23
{ INFO_STACKED("mt25ql01g", 0x20ba21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
24
--
25
2.25.4
26
27
diff view generated by jsdifflib
1
The model uses today the "Normal priority transmit buffer unavailable"
1
From: Andrew Jeffery <andrew@codeconstruct.com.au>
2
interrupt status which it is not appropriate. According to the Aspeed
3
specs, no interrupts are raised in that case. An "AHB error" status
4
seems like a better modeling choice for all implementations since it
5
is covered by the Linux kernel.
6
2
7
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
3
I've changed employers, have company email that deals with patch-based
8
Reviewed-by: Joel Stanley <joel@jms.id.au>
4
workflows without too much of a headache, and am trying to steer some
9
Message-Id: <20200819100956.2216690-13-clg@kaod.org>
5
content out of my personal mail.
6
7
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
---
9
---
12
hw/net/ftgmac100.c | 2 +-
10
MAINTAINERS | 2 +-
13
1 file changed, 1 insertion(+), 1 deletion(-)
11
1 file changed, 1 insertion(+), 1 deletion(-)
14
12
15
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
13
diff --git a/MAINTAINERS b/MAINTAINERS
16
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
17
--- a/hw/net/ftgmac100.c
15
--- a/MAINTAINERS
18
+++ b/hw/net/ftgmac100.c
16
+++ b/MAINTAINERS
19
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
17
@@ -XXX,XX +XXX,XX @@ F: docs/system/arm/emcraft-sf2.rst
20
if (dma_memory_read(&address_space_memory, bd.des3, ptr, len)) {
18
ASPEED BMCs
21
qemu_log_mask(LOG_GUEST_ERROR, "%s: failed to read packet @ 0x%x\n",
19
M: Cédric Le Goater <clg@kaod.org>
22
__func__, bd.des3);
20
M: Peter Maydell <peter.maydell@linaro.org>
23
- s->isr |= FTGMAC100_INT_NO_NPTXBUF;
21
-R: Andrew Jeffery <andrew@aj.id.au>
24
+ s->isr |= FTGMAC100_INT_AHB_ERR;
22
+R: Andrew Jeffery <andrew@codeconstruct.com.au>
25
break;
23
R: Joel Stanley <joel@jms.id.au>
26
}
24
L: qemu-arm@nongnu.org
27
25
S: Maintained
28
--
26
--
29
2.25.4
27
2.41.0
30
28
31
29
diff view generated by jsdifflib
1
When inserting the VLAN tag in packets, memmove() can generate an
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
integer overflow for packets whose length is less than 12 bytes.
2
3
3
aspeed_soc.c contains definitions specific to the AST2400
4
Move the VLAN insertion when the last segment of the frame is reached
4
and AST2500 SoCs, but also some definitions for other AST
5
and check length against the size of the ethernet header (14 bytes) to
5
SoCs: move them to a common file.
6
avoid the crash. Return FTGMAC100_INT_XPKT_LOST status if the frame is
6
7
too small. This seems like a good modeling choice even if Aspeed does
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
not specify anything in that case.
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
10
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
11
Cc: Mauro Matteo Cascella <mcascell@redhat.com>
12
Reported-by: Ziming Zhang <ezrakiez@gmail.com>
13
Message-Id: <20200819100956.2216690-15-clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
10
---
16
hw/net/ftgmac100.c | 55 ++++++++++++++++++++++++++++++++--------------
11
hw/arm/aspeed_soc.c | 96 -------------------------------
17
1 file changed, 39 insertions(+), 16 deletions(-)
12
hw/arm/aspeed_soc_common.c | 114 +++++++++++++++++++++++++++++++++++++
18
13
hw/arm/meson.build | 1 +
19
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
14
3 files changed, 115 insertions(+), 96 deletions(-)
15
create mode 100644 hw/arm/aspeed_soc_common.c
16
17
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
20
index XXXXXXX..XXXXXXX 100644
18
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/net/ftgmac100.c
19
--- a/hw/arm/aspeed_soc.c
22
+++ b/hw/net/ftgmac100.c
20
+++ b/hw/arm/aspeed_soc.c
23
@@ -XXX,XX +XXX,XX @@ static int ftgmac100_write_bd(FTGMAC100Desc *bd, dma_addr_t addr)
21
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_register_types(void)
24
return 0;
22
};
25
}
23
26
24
type_init(aspeed_soc_register_types);
27
+static int ftgmac100_insert_vlan(FTGMAC100State *s, int frame_size,
25
-
28
+ uint8_t vlan_tci)
26
-qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
29
+{
27
-{
30
+ uint8_t *vlan_hdr = s->frame + (ETH_ALEN * 2);
28
- return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
31
+ uint8_t *payload = vlan_hdr + sizeof(struct vlan_header);
29
-}
32
+
30
-
33
+ if (frame_size < sizeof(struct eth_header)) {
31
-bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
34
+ qemu_log_mask(LOG_GUEST_ERROR,
32
-{
35
+ "%s: frame too small for VLAN insertion : %d bytes\n",
33
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
36
+ __func__, frame_size);
34
- SerialMM *smm;
37
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
35
-
38
+ goto out;
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
122
new file mode 100644
123
index XXXXXXX..XXXXXXX
124
--- /dev/null
125
+++ b/hw/arm/aspeed_soc_common.c
126
@@ -XXX,XX +XXX,XX @@
127
+/*
128
+ * ASPEED SoC family
129
+ *
130
+ * Andrew Jeffery <andrew@aj.id.au>
131
+ * Jeremy Kerr <jk@ozlabs.org>
132
+ *
133
+ * Copyright 2016 IBM Corp.
134
+ *
135
+ * This code is licensed under the GPL version 2 or later. See
136
+ * the COPYING file in the top-level directory.
137
+ */
138
+
139
+#include "qemu/osdep.h"
140
+#include "qapi/error.h"
141
+#include "hw/misc/unimp.h"
142
+#include "hw/arm/aspeed_soc.h"
143
+#include "hw/char/serial.h"
144
+
145
+
146
+qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
147
+{
148
+ return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
149
+}
150
+
151
+bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
152
+{
153
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
154
+ SerialMM *smm;
155
+
156
+ for (int i = 0, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
157
+ smm = &s->uart[i];
158
+
159
+ /* Chardev property is set by the machine. */
160
+ qdev_prop_set_uint8(DEVICE(smm), "regshift", 2);
161
+ qdev_prop_set_uint32(DEVICE(smm), "baudbase", 38400);
162
+ qdev_set_legacy_instance_id(DEVICE(smm), sc->memmap[uart], 2);
163
+ qdev_prop_set_uint8(DEVICE(smm), "endianness", DEVICE_LITTLE_ENDIAN);
164
+ if (!sysbus_realize(SYS_BUS_DEVICE(smm), errp)) {
165
+ return false;
166
+ }
167
+
168
+ sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, aspeed_soc_get_irq(s, uart));
169
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(smm), 0, sc->memmap[uart]);
39
+ }
170
+ }
40
+
171
+
41
+ if (frame_size + sizeof(struct vlan_header) > sizeof(s->frame)) {
172
+ return true;
42
+ qemu_log_mask(LOG_GUEST_ERROR,
173
+}
43
+ "%s: frame too big : %d bytes\n",
174
+
44
+ __func__, frame_size);
175
+void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr)
45
+ s->isr |= FTGMAC100_INT_XPKT_LOST;
176
+{
46
+ frame_size -= sizeof(struct vlan_header);
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);
201
+
202
+ /*
203
+ * Add a memory region beyond the RAM region to let firmwares scan
204
+ * the address space with load/store and guess how much RAM the
205
+ * SoC has.
206
+ */
207
+ if (ram_size < max_ram_size) {
208
+ DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
209
+
210
+ qdev_prop_set_string(dev, "name", "ram-empty");
211
+ qdev_prop_set_uint64(dev, "size", max_ram_size - ram_size);
212
+ if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
213
+ return false;
214
+ }
215
+
216
+ memory_region_add_subregion_overlap(&s->dram_container, ram_size,
217
+ sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0), -1000);
47
+ }
218
+ }
48
+
219
+
49
+ memmove(payload, vlan_hdr, frame_size - (ETH_ALEN * 2));
220
+ memory_region_add_subregion(s->memory,
50
+ stw_be_p(vlan_hdr, ETH_P_VLAN);
221
+ sc->memmap[ASPEED_DEV_SDRAM], &s->dram_container);
51
+ stw_be_p(vlan_hdr + 2, vlan_tci);
222
+ return true;
52
+ frame_size += sizeof(struct vlan_header);
223
+}
53
+
224
+
54
+out:
225
+void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr)
55
+ return frame_size;
226
+{
56
+}
227
+ memory_region_add_subregion(s->memory, addr,
57
+
228
+ sysbus_mmio_get_region(dev, n));
58
static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
229
+}
59
uint32_t tx_descriptor)
230
+
60
{
231
+void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
61
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
232
+ const char *name, hwaddr addr, uint64_t size)
62
break;
233
+{
63
}
234
+ qdev_prop_set_string(DEVICE(dev), "name", name);
64
235
+ qdev_prop_set_uint64(DEVICE(dev), "size", size);
65
- /* Check for VLAN */
236
+ sysbus_realize(dev, &error_abort);
66
- if (bd.des0 & FTGMAC100_TXDES0_FTS &&
237
+
67
- bd.des1 & FTGMAC100_TXDES1_INS_VLANTAG &&
238
+ memory_region_add_subregion_overlap(s->memory, addr,
68
- be16_to_cpu(PKT_GET_ETH_HDR(ptr)->h_proto) != ETH_P_VLAN) {
239
+ sysbus_mmio_get_region(dev, 0), -1000);
69
- if (frame_size + len + 4 > sizeof(s->frame)) {
240
+}
70
- qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
241
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
71
- __func__, len);
242
index XXXXXXX..XXXXXXX 100644
72
- s->isr |= FTGMAC100_INT_XPKT_LOST;
243
--- a/hw/arm/meson.build
73
- len = sizeof(s->frame) - frame_size - 4;
244
+++ b/hw/arm/meson.build
74
- }
245
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
75
- memmove(ptr + 16, ptr + 12, len - 12);
246
arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
76
- stw_be_p(ptr + 12, ETH_P_VLAN);
247
'aspeed_soc.c',
77
- stw_be_p(ptr + 14, bd.des1);
248
'aspeed.c',
78
- len += 4;
249
+ 'aspeed_soc_common.c',
79
- }
250
'aspeed_ast2600.c',
80
-
251
'aspeed_ast10x0.c',
81
ptr += len;
252
'aspeed_eeprom.c',
82
frame_size += len;
83
if (bd.des0 & FTGMAC100_TXDES0_LTS) {
84
+
85
+ /* Check for VLAN */
86
+ if (flags & FTGMAC100_TXDES1_INS_VLANTAG &&
87
+ be16_to_cpu(PKT_GET_ETH_HDR(s->frame)->h_proto) != ETH_P_VLAN) {
88
+ frame_size = ftgmac100_insert_vlan(s, frame_size,
89
+ FTGMAC100_TXDES1_VLANTAG_CI(flags));
90
+ }
91
+
92
if (flags & FTGMAC100_TXDES1_IP_CHKSUM) {
93
net_checksum_calculate(s->frame, frame_size);
94
}
95
--
253
--
96
2.25.4
254
2.41.0
97
255
98
256
diff view generated by jsdifflib
1
From: Igor Kononenko <i.kononenko@yadro.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Support a following SPI flashes:
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
4
* mx66l51235f
5
* mt25ql512ab
6
7
Signed-off-by: Igor Kononenko <i.kononenko@yadro.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Message-Id: <20200811203724.20699-1-i.kononenko@yadro.com>
10
Message-Id: <20200819100956.2216690-22-clg@kaod.org>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
---
6
---
13
hw/block/m25p80.c | 2 ++
7
hw/arm/aspeed_soc.c | 6 +++---
14
1 file changed, 2 insertions(+)
8
1 file changed, 3 insertions(+), 3 deletions(-)
15
9
16
diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c
10
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
17
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
18
--- a/hw/block/m25p80.c
12
--- a/hw/arm/aspeed_soc.c
19
+++ b/hw/block/m25p80.c
13
+++ b/hw/arm/aspeed_soc.c
20
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
14
@@ -XXX,XX +XXX,XX @@ static qemu_irq aspeed_soc_ast2400_get_irq(AspeedSoCState *s, int dev)
21
{ INFO("mx25l12855e", 0xc22618, 0, 64 << 10, 256, 0) },
15
return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[dev]);
22
{ INFO6("mx25l25635e", 0xc22019, 0xc22019, 64 << 10, 512, 0) },
16
}
23
{ INFO("mx25l25655e", 0xc22619, 0, 64 << 10, 512, 0) },
17
24
+ { INFO("mx66l51235f", 0xc2201a, 0, 64 << 10, 1024, ER_4K | ER_32K) },
18
-static void aspeed_soc_init(Object *obj)
25
{ INFO("mx66u51235f", 0xc2253a, 0, 64 << 10, 1024, ER_4K | ER_32K) },
19
+static void aspeed_ast2400_soc_init(Object *obj)
26
{ INFO("mx66u1g45g", 0xc2253b, 0, 64 << 10, 2048, ER_4K | ER_32K) },
20
{
27
{ INFO("mx66l1g45g", 0xc2201b, 0, 64 << 10, 2048, ER_4K | ER_32K) },
21
AspeedSoCState *s = ASPEED_SOC(obj);
28
@@ -XXX,XX +XXX,XX @@ static const FlashPartInfo known_devices[] = {
22
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
29
{ INFO("n25q256a", 0x20ba19, 0, 64 << 10, 512, ER_4K) },
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
30
{ INFO("n25q512a", 0x20ba20, 0, 64 << 10, 1024, ER_4K) },
24
static const TypeInfo aspeed_soc_ast2400_type_info = {
31
{ INFO("n25q512ax3", 0x20ba20, 0x1000, 64 << 10, 1024, ER_4K) },
25
.name = "ast2400-a1",
32
+ { INFO("mt25ql512ab", 0x20ba20, 0x1044, 64 << 10, 1024, ER_4K | ER_32K) },
26
.parent = TYPE_ASPEED_SOC,
33
{ INFO_STACKED("n25q00", 0x20ba21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
27
- .instance_init = aspeed_soc_init,
34
{ INFO_STACKED("n25q00a", 0x20bb21, 0x1000, 64 << 10, 2048, ER_4K, 4) },
28
+ .instance_init = aspeed_ast2400_soc_init,
35
{ INFO_STACKED("mt25ql01g", 0x20ba21, 0x1040, 64 << 10, 2048, ER_4K, 2) },
29
.instance_size = sizeof(AspeedSoCState),
30
.class_init = aspeed_soc_ast2400_class_init,
31
};
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
33
static const TypeInfo aspeed_soc_ast2500_type_info = {
34
.name = "ast2500-a1",
35
.parent = TYPE_ASPEED_SOC,
36
- .instance_init = aspeed_soc_init,
37
+ .instance_init = aspeed_ast2400_soc_init,
38
.instance_size = sizeof(AspeedSoCState),
39
.class_init = aspeed_soc_ast2500_class_init,
40
};
36
--
41
--
37
2.25.4
42
2.41.0
38
43
39
44
diff view generated by jsdifflib
1
From: Igor Kononenko <i.kononenko@yadro.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Provide a definition for the "25Hz reference clock input mode" strap
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: Igor Kononenko <i.kononenko@yadro.com>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Message-Id: <20200811203502.20382-1-i.kononenko@yadro.com>
8
Message-Id: <20200819100956.2216690-21-clg@kaod.org>
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_scu.h | 1 +
10
hw/arm/aspeed_soc.c | 15 +++++++++++----
12
1 file changed, 1 insertion(+)
11
1 file changed, 11 insertions(+), 4 deletions(-)
13
12
14
diff --git a/include/hw/misc/aspeed_scu.h b/include/hw/misc/aspeed_scu.h
13
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
15
index XXXXXXX..XXXXXXX 100644
14
index XXXXXXX..XXXXXXX 100644
16
--- a/include/hw/misc/aspeed_scu.h
15
--- a/hw/arm/aspeed_soc.c
17
+++ b/include/hw/misc/aspeed_scu.h
16
+++ b/hw/arm/aspeed_soc.c
18
@@ -XXX,XX +XXX,XX @@ uint32_t aspeed_scu_get_apb_freq(AspeedSCUState *s);
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
19
#define SCU_AST2500_HW_STRAP_ESPI_FLASH_ENABLE (0x1 << 26)
18
object_initialize_child(obj, "video", &s->video, TYPE_UNIMPLEMENTED_DEVICE);
20
#define SCU_AST2500_HW_STRAP_ESPI_ENABLE (0x1 << 25)
19
}
21
#define SCU_AST2500_HW_STRAP_DDR4_ENABLE (0x1 << 24)
20
22
+#define SCU_AST2500_HW_STRAP_25HZ_CLOCK_MODE (0x1 << 23)
21
-static void aspeed_soc_realize(DeviceState *dev, Error **errp)
23
22
+static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
24
#define SCU_AST2500_HW_STRAP_ACPI_ENABLE (0x1 << 19)
23
{
25
#define SCU_AST2500_HW_STRAP_USBCKI_FREQ (0x1 << 18)
24
int i;
25
AspeedSoCState *s = ASPEED_SOC(dev);
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);
34
}
35
36
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_soc_type_info = {
37
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
38
{
39
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
40
+ DeviceClass *dc = DEVICE_CLASS(oc);
41
+
42
+ dc->realize = aspeed_ast2400_soc_realize;
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");
26
--
60
--
27
2.25.4
61
2.41.0
28
62
29
63
diff view generated by jsdifflib
1
From: Erik Smit <erik.lucas.smit@gmail.com>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The BMC Firmware can be downloaded from :
3
We want to derivate the big AspeedSoCState object in some more
4
4
SoC-specific ones. Since the object size will vary, allocate it
5
https://www.supermicro.com/en/products/motherboard/X11SSL-F
5
dynamically.
6
6
7
Signed-off-by: Erik Smit <erik.lucas.smit@gmail.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Joel Stanley <joel@jms.id.au>
9
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
[ clg: Prettified Erik's name in email
11
Modified commit log ]
12
Message-Id: <20200715173418.186-1-erik.lucas.smit@gmail.com>
13
Message-Id: <20200819100956.2216690-6-clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
10
---
16
hw/arm/aspeed.c | 35 +++++++++++++++++++++++++++++++++++
11
hw/arm/aspeed.c | 101 +++++++++++++++++++++++++-----------------------
17
1 file changed, 35 insertions(+)
12
1 file changed, 52 insertions(+), 49 deletions(-)
18
13
19
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
20
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
21
--- a/hw/arm/aspeed.c
16
--- a/hw/arm/aspeed.c
22
+++ b/hw/arm/aspeed.c
17
+++ b/hw/arm/aspeed.c
23
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
18
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
24
SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
19
MachineState parent_obj;
25
SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
20
/* Public */
26
21
27
+/* TODO: Find the actual hardware value */
22
- AspeedSoCState soc;
28
+#define SUPERMICROX11_BMC_HW_STRAP1 ( \
23
+ AspeedSoCState *soc;
29
+ SCU_AST2400_HW_STRAP_DRAM_SIZE(DRAM_SIZE_128MB) | \
24
MemoryRegion boot_rom;
30
+ SCU_AST2400_HW_STRAP_DRAM_CONFIG(2) | \
25
bool mmio_exec;
31
+ SCU_AST2400_HW_STRAP_ACPI_DIS | \
26
uint32_t uart_chosen;
32
+ SCU_AST2400_HW_STRAP_SET_CLK_SOURCE(AST2400_CLK_48M_IN) | \
27
@@ -XXX,XX +XXX,XX @@ static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
33
+ SCU_HW_STRAP_VGA_CLASS_CODE | \
28
static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
34
+ SCU_HW_STRAP_LPC_RESET_PIN | \
29
uint64_t rom_size)
35
+ SCU_HW_STRAP_SPI_MODE(SCU_HW_STRAP_SPI_M_S_EN) | \
30
{
36
+ SCU_AST2400_HW_STRAP_SET_CPU_AHB_RATIO(AST2400_CPU_AHB_RATIO_2_1) | \
31
- AspeedSoCState *soc = &bmc->soc;
37
+ SCU_HW_STRAP_SPI_WIDTH | \
32
+ AspeedSoCState *soc = bmc->soc;
38
+ SCU_HW_STRAP_VGA_SIZE_SET(VGA_16M_DRAM) | \
33
39
+ SCU_AST2400_HW_STRAP_BOOT_MODE(AST2400_SPI_BOOT))
34
memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
40
+
35
&error_abort);
41
/* AST2500 evb hardware value: 0xF100C2E6 */
36
@@ -XXX,XX +XXX,XX @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
42
#define AST2500_EVB_HW_STRAP1 (( \
37
static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
43
AST2500_HW_STRAP1_DEFAULTS | \
38
{
44
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
39
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
45
aspeed_soc_num_cpus(amc->soc_name);
40
- AspeedSoCState *s = &bmc->soc;
46
};
41
+ AspeedSoCState *s = bmc->soc;
47
42
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
48
+static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
43
int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
49
+ void *data)
44
50
+{
45
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
51
+ MachineClass *mc = MACHINE_CLASS(oc);
46
int i;
52
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(oc);
47
NICInfo *nd = &nd_table[0];
53
+
48
54
+ mc->desc = "Supermicro X11 BMC (ARM926EJ-S)";
49
- object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
55
+ amc->soc_name = "ast2400-a1";
50
-
56
+ amc->hw_strap1 = SUPERMICROX11_BMC_HW_STRAP1;
51
- sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
57
+ amc->fmc_model = "mx25l25635e";
52
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
58
+ amc->spi_model = "mx25l25635e";
53
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
59
+ amc->num_cs = 1;
54
+ object_unref(OBJECT(bmc->soc));
60
+ amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
55
+ sc = ASPEED_SOC_GET_CLASS(bmc->soc);
61
+ amc->i2c_init = palmetto_bmc_i2c_init;
56
62
+ mc->default_ram_size = 256 * MiB;
57
/*
63
+}
58
* This will error out if the RAM size is not supported by the
64
+
59
* memory controller of the SoC.
65
static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
60
*/
66
{
61
- object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
67
MachineClass *mc = MACHINE_CLASS(oc);
62
+ object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
68
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_machine_types[] = {
63
&error_fatal);
69
.name = MACHINE_TYPE_NAME("palmetto-bmc"),
64
70
.parent = TYPE_ASPEED_MACHINE,
65
for (i = 0; i < sc->macs_num; i++) {
71
.class_init = aspeed_machine_palmetto_class_init,
66
if ((amc->macs_mask & (1 << i)) && nd->used) {
72
+ }, {
67
qemu_check_nic_model(nd, TYPE_FTGMAC100);
73
+ .name = MACHINE_TYPE_NAME("supermicrox11-bmc"),
68
- qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
74
+ .parent = TYPE_ASPEED_MACHINE,
69
+ qdev_set_nic_properties(DEVICE(&bmc->soc->ftgmac100[i]), nd);
75
+ .class_init = aspeed_machine_supermicrox11_bmc_class_init,
70
nd++;
76
}, {
71
}
77
.name = MACHINE_TYPE_NAME("ast2500-evb"),
72
}
78
.parent = TYPE_ASPEED_MACHINE,
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 */
292
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
293
static void fby35_reset(MachineState *state, ShutdownCause reason)
294
{
295
AspeedMachineState *bmc = ASPEED_MACHINE(state);
296
- AspeedGPIOState *gpio = &bmc->soc.gpio;
297
+ AspeedGPIOState *gpio = &bmc->soc->gpio;
298
299
qemu_devices_reset(reason);
300
301
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
302
sysclk = clock_new(OBJECT(machine), "SYSCLK");
303
clock_set_hz(sysclk, SYSCLK_FRQ);
304
305
- object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
306
- qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
307
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
308
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
309
+ object_unref(OBJECT(bmc->soc));
310
+ qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
311
312
- object_property_set_link(OBJECT(&bmc->soc), "memory",
313
+ object_property_set_link(OBJECT(bmc->soc), "memory",
314
OBJECT(get_system_memory()), &error_abort);
315
connect_serial_hds_to_uarts(bmc);
316
- qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
317
+ qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
318
319
- aspeed_board_init_flashes(&bmc->soc.fmc,
320
+ aspeed_board_init_flashes(&bmc->soc->fmc,
321
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
322
amc->num_cs,
323
0);
324
325
- aspeed_board_init_flashes(&bmc->soc.spi[0],
326
+ aspeed_board_init_flashes(&bmc->soc->spi[0],
327
bmc->spi_model ? bmc->spi_model : amc->spi_model,
328
amc->num_cs, amc->num_cs);
329
330
- aspeed_board_init_flashes(&bmc->soc.spi[1],
331
+ aspeed_board_init_flashes(&bmc->soc->spi[1],
332
bmc->spi_model ? bmc->spi_model : amc->spi_model,
333
amc->num_cs, (amc->num_cs * 2));
334
335
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
336
337
static void ast1030_evb_i2c_init(AspeedMachineState *bmc)
338
{
339
- AspeedSoCState *soc = &bmc->soc;
340
+ AspeedSoCState *soc = bmc->soc;
341
342
/* U10 24C08 connects to SDA/SCL Group 1 by default */
343
uint8_t *eeprom_buf = g_malloc0(32 * 1024);
79
--
344
--
80
2.25.4
345
2.41.0
81
346
82
347
diff view generated by jsdifflib
1
This change works around the HW default values to be able to test the
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
Tacoma board with -kernel command line option. This was required when
3
we had both flash chips enabled in the device tree, otherwise Linux
4
would fail to probe the entire controller leaving it with no rootfs.
5
2
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
3
TYPE_ASPEED10X0_SOC inherits from TYPE_ASPEED_SOC.
7
Message-Id: <20200819100956.2216690-20-clg@kaod.org>
4
In few commits we'll add more fields, but to keep
5
review process simple, don't add any yet.
6
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
10
---
10
hw/ssi/aspeed_smc.c | 2 +-
11
include/hw/arm/aspeed_soc.h | 7 +++++++
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
hw/arm/aspeed_ast10x0.c | 26 +++++++++++++-------------
13
2 files changed, 20 insertions(+), 13 deletions(-)
12
14
13
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
14
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/ssi/aspeed_smc.c
17
--- a/include/hw/arm/aspeed_soc.h
16
+++ b/hw/ssi/aspeed_smc.c
18
+++ b/include/hw/arm/aspeed_soc.h
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_smc_reg_to_segment(const AspeedSMCState *s, uint32_t reg,
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
18
20
#define TYPE_ASPEED_SOC "aspeed-soc"
19
static const AspeedSegments aspeed_segments_ast2600_fmc[] = {
21
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
20
{ 0x0, 128 * MiB }, /* start address is readonly */
22
21
- { 0x0, 0 }, /* disabled */
23
+struct Aspeed10x0SoCState {
22
+ { 128 * MiB, 128 * MiB }, /* default is disabled but needed for -kernel */
24
+ AspeedSoCState parent;
23
{ 0x0, 0 }, /* disabled */
25
+};
26
+
27
+#define TYPE_ASPEED10X0_SOC "aspeed10x0-soc"
28
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed10x0SoCState, ASPEED10X0_SOC)
29
+
30
struct AspeedSoCClass {
31
DeviceClass parent_class;
32
33
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
34
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/aspeed_ast10x0.c
36
+++ b/hw/arm/aspeed_ast10x0.c
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
38
sc->get_irq = aspeed_soc_ast1030_get_irq;
39
}
40
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
+ },
24
};
60
};
25
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)
26
--
69
--
27
2.25.4
70
2.41.0
28
71
29
72
diff view generated by jsdifflib
1
The read access size of the SCU registers can be 1/2/4 bytes and write
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
is 4 bytes and all Aspeed models would need a .valid.accepts() handler.
3
2
4
For the moment, set the min access size to 1 byte to cover both read
3
TYPE_ASPEED2600_SOC inherits from TYPE_ASPEED_SOC.
5
and write operations on the AST2400 but keep the min access size of
4
In few commits we'll add more fields, but to keep
6
the other SoCs to 4 bytes as this is an unusual access size.
5
review process simple, don't add any yet.
7
6
8
This fixes support for some old firmware doing 2 bytes reads on the
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
AST2400 SoC.
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
11
Reported-by: Erik Smit <erik.lucas.smit@gmail.com>
12
Reviewed-by: Joel Stanley <joel@jms.id.au>
13
Message-Id: <20200819100956.2216690-5-clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
---
10
---
16
hw/misc/aspeed_scu.c | 7 ++++---
11
include/hw/arm/aspeed_soc.h | 7 +++++++
17
1 file changed, 4 insertions(+), 3 deletions(-)
12
hw/arm/aspeed_ast2600.c | 26 +++++++++++++-------------
13
2 files changed, 20 insertions(+), 13 deletions(-)
18
14
19
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
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/hw/misc/aspeed_scu.c
17
--- a/include/hw/arm/aspeed_soc.h
22
+++ b/hw/misc/aspeed_scu.c
18
+++ b/include/hw/arm/aspeed_soc.h
23
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_ast2400_scu_ops = {
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
24
.read = aspeed_scu_read,
20
#define TYPE_ASPEED_SOC "aspeed-soc"
25
.write = aspeed_ast2400_scu_write,
21
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
26
.endianness = DEVICE_LITTLE_ENDIAN,
22
27
- .valid.min_access_size = 4,
23
+struct Aspeed2600SoCState {
28
- .valid.max_access_size = 4,
24
+ AspeedSoCState parent;
29
- .valid.unaligned = false,
25
+};
30
+ .valid = {
26
+
31
+ .min_access_size = 1,
27
+#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
32
+ .max_access_size = 4,
28
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2600SoCState, ASPEED2600_SOC)
29
+
30
struct Aspeed10x0SoCState {
31
AspeedSoCState parent;
32
};
33
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
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;
39
}
40
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,
33
+ },
59
+ },
34
};
60
};
35
61
36
static const MemoryRegionOps aspeed_ast2500_scu_ops = {
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)
37
--
69
--
38
2.25.4
70
2.41.0
39
71
40
72
diff view generated by jsdifflib
1
Changes in commit 533eb415df2e ("arm/aspeed: actually check RAM size")
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
introduced a 'valid_ram_sizes' array which can be used to compute the
3
associated bit field value encoding the RAM size. The field is simply
4
the index of the array.
5
2
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
3
TYPE_ASPEED2400_SOC inherits from TYPE_ASPEED_SOC.
7
Message-Id: <20200819100956.2216690-19-clg@kaod.org>
4
In few commits we'll add more fields, but to keep
5
review process simple, don't add any yet.
6
7
TYPE_ASPEED_SOC is common to various Aspeed SoCs,
8
define it in aspeed_soc_common.c.
9
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
13
---
10
hw/misc/aspeed_sdmc.c | 79 ++++++++++++++-----------------------------
14
include/hw/arm/aspeed_soc.h | 7 +++++
11
1 file changed, 25 insertions(+), 54 deletions(-)
15
hw/arm/aspeed_soc.c | 61 +++++++++++--------------------------
16
hw/arm/aspeed_soc_common.c | 29 ++++++++++++++++++
17
3 files changed, 53 insertions(+), 44 deletions(-)
12
18
13
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
19
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/misc/aspeed_sdmc.c
21
--- a/include/hw/arm/aspeed_soc.h
16
+++ b/hw/misc/aspeed_sdmc.c
22
+++ b/include/hw/arm/aspeed_soc.h
17
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_sdmc_ops = {
23
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
18
.valid.max_access_size = 4,
24
#define TYPE_ASPEED_SOC "aspeed-soc"
25
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
26
27
+struct Aspeed2400SoCState {
28
+ AspeedSoCState parent;
29
+};
30
+
31
+#define TYPE_ASPEED2400_SOC "aspeed2400-soc"
32
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2400SoCState, ASPEED2400_SOC)
33
+
34
struct Aspeed2600SoCState {
35
AspeedSoCState parent;
19
};
36
};
20
37
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
21
-static int ast2400_rambits(AspeedSDMCState *s)
38
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/arm/aspeed_soc.c
40
+++ b/hw/arm/aspeed_soc.c
41
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
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)
22
-{
54
-{
23
- switch (s->ram_size >> 20) {
55
- DeviceClass *dc = DEVICE_CLASS(oc);
24
- case 64:
56
-
25
- return ASPEED_SDMC_DRAM_64MB;
57
- device_class_set_props(dc, aspeed_soc_properties);
26
- case 128:
27
- return ASPEED_SDMC_DRAM_128MB;
28
- case 256:
29
- return ASPEED_SDMC_DRAM_256MB;
30
- case 512:
31
- return ASPEED_SDMC_DRAM_512MB;
32
- default:
33
- g_assert_not_reached();
34
- break;
35
- }
36
-}
58
-}
37
-
59
-
38
-static int ast2500_rambits(AspeedSDMCState *s)
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)
39
-{
98
-{
40
- switch (s->ram_size >> 20) {
99
- type_register_static(&aspeed_soc_type_info);
41
- case 128:
100
- type_register_static(&aspeed_soc_ast2400_type_info);
42
- return ASPEED_SDMC_AST2500_128MB;
101
- type_register_static(&aspeed_soc_ast2500_type_info);
43
- case 256:
102
+static const TypeInfo aspeed_soc_ast2400_types[] = {
44
- return ASPEED_SDMC_AST2500_256MB;
103
+ {
45
- case 512:
104
+ .name = TYPE_ASPEED2400_SOC,
46
- return ASPEED_SDMC_AST2500_512MB;
105
+ .parent = TYPE_ASPEED_SOC,
47
- case 1024:
106
+ .instance_init = aspeed_ast2400_soc_init,
48
- return ASPEED_SDMC_AST2500_1024MB;
107
+ .instance_size = sizeof(Aspeed2400SoCState),
49
- default:
108
+ .abstract = true,
50
- g_assert_not_reached();
109
+ }, {
51
- break;
110
+ .name = "ast2400-a1",
52
- }
111
+ .parent = TYPE_ASPEED2400_SOC,
53
-}
112
+ .class_init = aspeed_soc_ast2400_class_init,
54
-
113
+ }, {
55
-static int ast2600_rambits(AspeedSDMCState *s)
114
+ .name = "ast2500-a1",
56
-{
115
+ .parent = TYPE_ASPEED2400_SOC,
57
- switch (s->ram_size >> 20) {
116
+ .class_init = aspeed_soc_ast2500_class_init,
58
- case 256:
117
+ },
59
- return ASPEED_SDMC_AST2600_256MB;
60
- case 512:
61
- return ASPEED_SDMC_AST2600_512MB;
62
- case 1024:
63
- return ASPEED_SDMC_AST2600_1024MB;
64
- case 2048:
65
- return ASPEED_SDMC_AST2600_2048MB;
66
- default:
67
- g_assert_not_reached();
68
- break;
69
- }
70
-}
71
-
72
static void aspeed_sdmc_reset(DeviceState *dev)
73
{
74
AspeedSDMCState *s = ASPEED_SDMC(dev);
75
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_sdmc_info = {
76
.abstract = true,
77
};
118
};
78
119
79
+static int aspeed_sdmc_get_ram_bits(AspeedSDMCState *s)
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)
80
+{
148
+{
81
+ AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
149
+ DeviceClass *dc = DEVICE_CLASS(oc);
82
+ int i;
83
+
150
+
84
+ /*
151
+ device_class_set_props(dc, aspeed_soc_properties);
85
+ * The bitfield value encoding the RAM size is the index of the
86
+ * possible RAM size array
87
+ */
88
+ for (i = 0; asc->valid_ram_sizes[i]; i++) {
89
+ if (s->ram_size == asc->valid_ram_sizes[i]) {
90
+ return i;
91
+ }
92
+ }
93
+
94
+ /*
95
+ * Invalid RAM sizes should have been excluded when setting the
96
+ * SoC RAM size.
97
+ */
98
+ g_assert_not_reached();
99
+}
152
+}
100
+
153
+
101
static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
154
+static const TypeInfo aspeed_soc_types[] = {
102
{
155
+ {
103
uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT |
156
+ .name = TYPE_ASPEED_SOC,
104
- ASPEED_SDMC_DRAM_SIZE(ast2400_rambits(s));
157
+ .parent = TYPE_DEVICE,
105
+ ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
158
+ .instance_size = sizeof(AspeedSoCState),
106
159
+ .class_size = sizeof(AspeedSoCClass),
107
/* Make sure readonly bits are kept */
160
+ .class_init = aspeed_soc_class_init,
108
data &= ~ASPEED_SDMC_READONLY_MASK;
161
+ .abstract = true,
109
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
162
+ },
110
uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
163
+};
111
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
164
+
112
ASPEED_SDMC_CACHE_INITIAL_DONE |
165
+DEFINE_TYPES(aspeed_soc_types)
113
- ASPEED_SDMC_DRAM_SIZE(ast2500_rambits(s));
114
+ ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
115
116
/* Make sure readonly bits are kept */
117
data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
118
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
119
{
120
uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(3) |
121
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
122
- ASPEED_SDMC_DRAM_SIZE(ast2600_rambits(s));
123
+ ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
124
125
/* Make sure readonly bits are kept (use ast2500 mask) */
126
data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
127
--
166
--
128
2.25.4
167
2.41.0
129
168
130
169
diff view generated by jsdifflib
1
BIT(0) of the ASPEED_SDHCI_INFO register is set by SW and polled until
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
the bit is cleared by HW.
3
2
4
Use the number of supported slots to define the default value of this
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
register (The AST2600 eMMC Controller only has one). Fix the reset
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
6
sequence by clearing automatically the RESET bit.
7
8
Cc: Eddie James <eajames@linux.ibm.com>
9
Fixes: 2bea128c3d0b ("hw/sd/aspeed_sdhci: New device")
10
Reviewed-by: Joel Stanley <joel@jms.id.au>
11
Message-Id: <20200819100956.2216690-9-clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
6
---
14
hw/sd/aspeed_sdhci.c | 14 ++++++++++++--
7
hw/arm/aspeed_soc_common.c | 11 +++++++++++
15
1 file changed, 12 insertions(+), 2 deletions(-)
8
1 file changed, 11 insertions(+)
16
9
17
diff --git a/hw/sd/aspeed_sdhci.c b/hw/sd/aspeed_sdhci.c
10
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
18
index XXXXXXX..XXXXXXX 100644
11
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/sd/aspeed_sdhci.c
12
--- a/hw/arm/aspeed_soc_common.c
20
+++ b/hw/sd/aspeed_sdhci.c
13
+++ b/hw/arm/aspeed_soc_common.c
21
@@ -XXX,XX +XXX,XX @@
14
@@ -XXX,XX +XXX,XX @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
22
#include "hw/qdev-properties.h"
15
sysbus_mmio_get_region(dev, 0), -1000);
23
16
}
24
#define ASPEED_SDHCI_INFO 0x00
17
25
-#define ASPEED_SDHCI_INFO_RESET 0x00030000
18
+static void aspeed_soc_realize(DeviceState *dev, Error **errp)
26
+#define ASPEED_SDHCI_INFO_SLOT1 (1 << 17)
19
+{
27
+#define ASPEED_SDHCI_INFO_SLOT0 (1 << 16)
20
+ AspeedSoCState *s = ASPEED_SOC(dev);
28
+#define ASPEED_SDHCI_INFO_RESET (1 << 0)
29
#define ASPEED_SDHCI_DEBOUNCE 0x04
30
#define ASPEED_SDHCI_DEBOUNCE_RESET 0x00000005
31
#define ASPEED_SDHCI_BUS 0x08
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_write(void *opaque, hwaddr addr, uint64_t val,
33
AspeedSDHCIState *sdhci = opaque;
34
35
switch (addr) {
36
+ case ASPEED_SDHCI_INFO:
37
+ /* The RESET bit automatically clears. */
38
+ sdhci->regs[TO_REG(addr)] = (uint32_t)val & ~ASPEED_SDHCI_INFO_RESET;
39
+ break;
40
case ASPEED_SDHCI_SDIO_140:
41
sdhci->slots[0].capareg = (uint64_t)(uint32_t)val;
42
break;
43
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdhci_reset(DeviceState *dev)
44
AspeedSDHCIState *sdhci = ASPEED_SDHCI(dev);
45
46
memset(sdhci->regs, 0, ASPEED_SDHCI_REG_SIZE);
47
- sdhci->regs[TO_REG(ASPEED_SDHCI_INFO)] = ASPEED_SDHCI_INFO_RESET;
48
+
21
+
49
+ sdhci->regs[TO_REG(ASPEED_SDHCI_INFO)] = ASPEED_SDHCI_INFO_SLOT0;
22
+ if (!s->memory) {
50
+ if (sdhci->num_slots == 2) {
23
+ error_setg(errp, "'memory' link is not set");
51
+ sdhci->regs[TO_REG(ASPEED_SDHCI_INFO)] |= ASPEED_SDHCI_INFO_SLOT1;
24
+ return;
52
+ }
25
+ }
53
sdhci->regs[TO_REG(ASPEED_SDHCI_DEBOUNCE)] = ASPEED_SDHCI_DEBOUNCE_RESET;
26
+}
27
+
28
static Property aspeed_soc_properties[] = {
29
DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
30
MemoryRegion *),
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
32
{
33
DeviceClass *dc = DEVICE_CLASS(oc);
34
35
+ dc->realize = aspeed_soc_realize;
36
device_class_set_props(dc, aspeed_soc_properties);
54
}
37
}
55
38
56
--
39
--
57
2.25.4
40
2.41.0
58
41
59
42
diff view generated by jsdifflib
1
The software reset of the MAC needs a finer granularity. Some settings
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
in MACCR are kept.
3
2
4
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
3
The v7-M core is specific to the Aspeed 10x0 series,
5
Fixes: bd44300d1afc ("net: add FTGMAC100 support")
4
remove it from the common AspeedSoCState.
6
Message-Id: <20200819100956.2216690-16-clg@kaod.org>
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
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
hw/net/ftgmac100.c | 18 +++++++++++++-----
10
include/hw/arm/aspeed_soc.h | 5 ++---
10
1 file changed, 13 insertions(+), 5 deletions(-)
11
hw/arm/aspeed_ast10x0.c | 27 +++++++++++++++------------
12
hw/arm/fby35.c | 13 ++++++++-----
13
3 files changed, 25 insertions(+), 20 deletions(-)
11
14
12
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
13
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/ftgmac100.c
17
--- a/include/hw/arm/aspeed_soc.h
15
+++ b/hw/net/ftgmac100.c
18
+++ b/include/hw/arm/aspeed_soc.h
16
@@ -XXX,XX +XXX,XX @@ static uint32_t ftgmac100_rxpoll(FTGMAC100State *s)
19
@@ -XXX,XX +XXX,XX @@
17
return cnt / div[speed];
20
#define ASPEED_JTAG_NUM 2
21
22
struct AspeedSoCState {
23
- /*< private >*/
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;
39
};
40
41
#define TYPE_ASPEED10X0_SOC "aspeed10x0-soc"
42
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
43
index XXXXXXX..XXXXXXX 100644
44
--- a/hw/arm/aspeed_ast10x0.c
45
+++ b/hw/arm/aspeed_ast10x0.c
46
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast1030_irqmap[] = {
47
48
static qemu_irq aspeed_soc_ast1030_get_irq(AspeedSoCState *s, int dev)
49
{
50
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(s);
51
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
52
53
- return qdev_get_gpio_in(DEVICE(&s->armv7m), sc->irqmap[dev]);
54
+ return qdev_get_gpio_in(DEVICE(&a->armv7m), sc->irqmap[dev]);
18
}
55
}
19
56
20
-static void ftgmac100_reset(DeviceState *d)
57
static void aspeed_soc_ast1030_init(Object *obj)
21
+static void ftgmac100_do_reset(FTGMAC100State *s, bool sw_reset)
22
{
58
{
23
- FTGMAC100State *s = FTGMAC100(d);
59
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(obj);
24
-
60
AspeedSoCState *s = ASPEED_SOC(obj);
25
/* Reset the FTGMAC100 */
61
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
26
s->isr = 0;
62
char socname[8];
27
s->ier = 0;
63
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
28
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_reset(DeviceState *d)
64
g_assert_not_reached();
29
s->fear1 = 0;
65
}
30
s->tpafcr = 0xf1;
66
31
67
- object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
32
- s->maccr = 0;
68
+ object_initialize_child(obj, "armv7m", &a->armv7m, TYPE_ARMV7M);
33
+ if (sw_reset) {
69
34
+ s->maccr &= FTGMAC100_MACCR_GIGA_MODE | FTGMAC100_MACCR_FAST_MODE;
70
s->sysclk = qdev_init_clock_in(DEVICE(s), "sysclk", NULL, NULL, 0);
35
+ } else {
71
36
+ s->maccr = 0;
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
37
+ }
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;
38
+
162
+
39
s->phycr = 0;
163
s->bic_sysclk = clock_new(OBJECT(s), "SYSCLK");
40
s->phydata = 0;
164
clock_set_hz(s->bic_sysclk, 200000000ULL);
41
s->fcr = 0x400;
165
42
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_reset(DeviceState *d)
166
object_initialize_child(OBJECT(s), "bic", &s->bic, "ast1030-a1");
43
phy_reset(s);
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);
44
}
185
}
45
186
46
+static void ftgmac100_reset(DeviceState *d)
187
static void fby35_init(MachineState *machine)
47
+{
48
+ ftgmac100_do_reset(FTGMAC100(d), false);
49
+}
50
+
51
static uint64_t ftgmac100_read(void *opaque, hwaddr addr, unsigned size)
52
{
53
FTGMAC100State *s = FTGMAC100(opaque);
54
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_write(void *opaque, hwaddr addr,
55
case FTGMAC100_MACCR: /* MAC Device control */
56
s->maccr = value;
57
if (value & FTGMAC100_MACCR_SW_RST) {
58
- ftgmac100_reset(DEVICE(s));
59
+ ftgmac100_do_reset(s, true);
60
}
61
62
if (ftgmac100_can_receive(qemu_get_queue(s->nic))) {
63
--
188
--
64
2.25.4
189
2.41.0
65
190
66
191
diff view generated by jsdifflib
1
Unaligned access support is a leftover from the initial commit. There
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
is no such need on this device register mapping. Remove it.
2
3
3
The v7-A cluster is specific to the Aspeed 2600 series,
4
Cc: Michael S. Tsirkin <mst@redhat.com>
4
remove it from the common AspeedSoCState.
5
Reviewed-by: Joel Stanley <joel@jms.id.au>
5
6
Message-Id: <20200819100956.2216690-7-clg@kaod.org>
6
The ARM cores belong to the MP cluster, but the array
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>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
13
---
9
hw/ssi/aspeed_smc.c | 2 --
14
include/hw/arm/aspeed_soc.h | 4 ++-
10
1 file changed, 2 deletions(-)
15
hw/arm/aspeed_ast2600.c | 49 ++++++++++++++++++++-----------------
11
16
hw/arm/fby35.c | 14 ++++++-----
12
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
17
3 files changed, 37 insertions(+), 30 deletions(-)
18
19
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
13
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/ssi/aspeed_smc.c
21
--- a/include/hw/arm/aspeed_soc.h
15
+++ b/hw/ssi/aspeed_smc.c
22
+++ b/include/hw/arm/aspeed_soc.h
16
@@ -XXX,XX +XXX,XX @@ static const MemoryRegionOps aspeed_smc_ops = {
23
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
17
.read = aspeed_smc_read,
24
DeviceState parent;
18
.write = aspeed_smc_write,
25
19
.endianness = DEVICE_LITTLE_ENDIAN,
26
ARMCPU cpu[ASPEED_CPUS_NUM];
20
- .valid.unaligned = true,
27
- A15MPPrivState a7mpcore;
28
MemoryRegion *memory;
29
MemoryRegion *dram_mr;
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 */
21
};
38
};
22
39
23
-
40
#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
24
/*
41
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
25
* Initialize the custom address spaces for DMAs
42
index XXXXXXX..XXXXXXX 100644
26
*/
43
--- a/hw/arm/aspeed_ast2600.c
44
+++ b/hw/arm/aspeed_ast2600.c
45
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
46
47
static qemu_irq aspeed_soc_ast2600_get_irq(AspeedSoCState *s, int dev)
48
{
49
+ Aspeed2600SoCState *a = ASPEED2600_SOC(s);
50
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
51
52
- return qdev_get_gpio_in(DEVICE(&s->a7mpcore), sc->irqmap[dev]);
53
+ return qdev_get_gpio_in(DEVICE(&a->a7mpcore), sc->irqmap[dev]);
54
}
55
56
static void aspeed_soc_ast2600_init(Object *obj)
57
{
58
+ Aspeed2600SoCState *a = ASPEED2600_SOC(obj);
59
AspeedSoCState *s = ASPEED_SOC(obj);
60
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
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)
89
/* CPU */
90
for (i = 0; i < sc->num_cpus; i++) {
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,
27
--
243
--
28
2.25.4
244
2.41.0
29
245
30
246
diff view generated by jsdifflib
Deleted patch
1
The legacy controller only has one slave.
2
1
3
Reviewed-by: Joel Stanley <joel@jms.id.au>
4
Message-Id: <20200819100956.2216690-8-clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
7
hw/ssi/aspeed_smc.c | 2 +-
8
1 file changed, 1 insertion(+), 1 deletion(-)
9
10
diff --git a/hw/ssi/aspeed_smc.c b/hw/ssi/aspeed_smc.c
11
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/ssi/aspeed_smc.c
13
+++ b/hw/ssi/aspeed_smc.c
14
@@ -XXX,XX +XXX,XX @@ static const AspeedSMCController controllers[] = {
15
.r_timings = R_TIMINGS,
16
.nregs_timings = 1,
17
.conf_enable_w0 = CONF_ENABLE_W0,
18
- .max_slaves = 5,
19
+ .max_slaves = 1,
20
.segments = aspeed_segments_legacy,
21
.flash_window_base = ASPEED_SOC_SMC_FLASH_BASE,
22
.flash_window_size = 0x6000000,
23
--
24
2.25.4
25
26
diff view generated by jsdifflib
Deleted patch
1
Receive Ring Base Address Register (RXR_BADR) and the Normal Priority
2
Transmit Receive Ring Base Address Register (NPTXR_BADR) can also be
3
read.
4
1
5
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
6
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
7
Reviewed-by: Joel Stanley <joel@jms.id.au>
8
Message-Id: <20200819100956.2216690-10-clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
11
hw/net/ftgmac100.c | 4 ++++
12
1 file changed, 4 insertions(+)
13
14
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
15
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/net/ftgmac100.c
17
+++ b/hw/net/ftgmac100.c
18
@@ -XXX,XX +XXX,XX @@ static uint64_t ftgmac100_read(void *opaque, hwaddr addr, unsigned size)
19
return s->math[0];
20
case FTGMAC100_MATH1:
21
return s->math[1];
22
+ case FTGMAC100_RXR_BADR:
23
+ return s->rx_ring;
24
+ case FTGMAC100_NPTXR_BADR:
25
+ return s->tx_ring;
26
case FTGMAC100_ITC:
27
return s->itc;
28
case FTGMAC100_DBLAC:
29
--
30
2.25.4
31
32
diff view generated by jsdifflib
Deleted patch
1
The second field of the TX descriptor has a set of flags to choose
2
when the transmit interrupt is raised : after the packet has been sent
3
on the ethernet or after it has been moved into the TX FIFO. But we
4
don't model that today.
5
1
6
Simply raise the "Packet transmitted on ethernet" interrupt status bit
7
as soon as the packet is sent by QEMU.
8
9
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
10
Reviewed-by: Joel Stanley <joel@jms.id.au>
11
Message-Id: <20200819100956.2216690-11-clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
14
hw/net/ftgmac100.c | 4 +---
15
1 file changed, 1 insertion(+), 3 deletions(-)
16
17
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
18
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/net/ftgmac100.c
20
+++ b/hw/net/ftgmac100.c
21
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
22
qemu_send_packet(qemu_get_queue(s->nic), s->frame, frame_size);
23
ptr = s->frame;
24
frame_size = 0;
25
- if (flags & FTGMAC100_TXDES1_TXIC) {
26
- s->isr |= FTGMAC100_INT_XPKT_ETH;
27
- }
28
+ s->isr |= FTGMAC100_INT_XPKT_ETH;
29
}
30
31
if (flags & FTGMAC100_TXDES1_TX2FIC) {
32
--
33
2.25.4
34
35
diff view generated by jsdifflib
Deleted patch
1
As we don't model the RX or TX FIFO, raise the "Packet moved to RX
2
FIFO" interrupt status bit as soon as we are handling a RX packet.
3
1
4
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
5
Reviewed-by: Joel Stanley <joel@jms.id.au>
6
Message-Id: <20200819100956.2216690-12-clg@kaod.org>
7
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
---
9
hw/net/ftgmac100.c | 3 +--
10
1 file changed, 1 insertion(+), 2 deletions(-)
11
12
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
13
index XXXXXXX..XXXXXXX 100644
14
--- a/hw/net/ftgmac100.c
15
+++ b/hw/net/ftgmac100.c
16
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
17
break;
18
}
19
20
+ s->isr |= FTGMAC100_INT_RPKT_FIFO;
21
addr = s->rx_descriptor;
22
while (size > 0) {
23
if (!ftgmac100_can_receive(nc)) {
24
@@ -XXX,XX +XXX,XX @@ static ssize_t ftgmac100_receive(NetClientState *nc, const uint8_t *buf,
25
/* Last buffer in frame. */
26
bd.des0 |= flags | FTGMAC100_RXDES0_LRS;
27
s->isr |= FTGMAC100_INT_RPKT_BUF;
28
- } else {
29
- s->isr |= FTGMAC100_INT_RPKT_FIFO;
30
}
31
ftgmac100_write_bd(&bd, addr);
32
if (bd.des0 & s->rxdes0_edorr) {
33
--
34
2.25.4
35
36
diff view generated by jsdifflib
Deleted patch
1
According to the Aspeed specs, no interrupts are raised in that case
2
but a "Tx-packets lost" status seems like a good modeling choice for
3
all implementations. It is covered by the Linux kernel.
4
1
5
Cc: Frederic Konrad <konrad.frederic@yahoo.fr>
6
Reviewed-by: Joel Stanley <joel@jms.id.au>
7
Message-Id: <20200819100956.2216690-14-clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
10
hw/net/ftgmac100.c | 9 +++++++++
11
1 file changed, 9 insertions(+)
12
13
diff --git a/hw/net/ftgmac100.c b/hw/net/ftgmac100.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/net/ftgmac100.c
16
+++ b/hw/net/ftgmac100.c
17
@@ -XXX,XX +XXX,XX @@ static void ftgmac100_do_tx(FTGMAC100State *s, uint32_t tx_ring,
18
}
19
20
len = FTGMAC100_TXDES0_TXBUF_SIZE(bd.des0);
21
+ if (!len) {
22
+ /*
23
+ * 0 is an invalid size, however the HW does not raise any
24
+ * interrupt. Flag an error because the guest is buggy.
25
+ */
26
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid segment size\n",
27
+ __func__);
28
+ }
29
+
30
if (frame_size + len > sizeof(s->frame)) {
31
qemu_log_mask(LOG_GUEST_ERROR, "%s: frame too big : %d bytes\n",
32
__func__, len);
33
--
34
2.25.4
35
36
diff view generated by jsdifflib
1
From: Joel Stanley <joel@jms.id.au>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
This allows qemu to run the "normal" power on reset boot path through
3
The ARM array and VIC peripheral are only used by the
4
u-boot, where the DDR is trained.
4
2400 series, remove them from the common AspeedSoCState.
5
5
6
An enhancement would be to have the SCU bit stick across qemu reboots,
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
but be unset on initial boot.
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
9
Proper modelling would be to discard all writes to the phy setting regs
10
at offset 0x100 - 0x400 and to model the phy status regs at offset
11
0x400.
12
13
The status regs model would only need to account for offets 0x00,
14
0x50, 0x68 and 0x7c.
15
16
Signed-off-by: Joel Stanley <joel@jms.id.au>
17
[ clg: checkpatch fixes ]
18
Message-Id: <20200819100956.2216690-17-clg@kaod.org>
19
Signed-off-by: Cédric Le Goater <clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
20
---
9
---
21
include/hw/misc/aspeed_sdmc.h | 13 ++++++++++++-
10
include/hw/arm/aspeed_soc.h | 5 +++--
22
hw/misc/aspeed_scu.c | 2 +-
11
hw/arm/{aspeed_soc.c => aspeed_ast2400.c} | 27 +++++++++++++----------
23
hw/misc/aspeed_sdmc.c | 19 +++++++++++++++++--
12
hw/arm/meson.build | 2 +-
24
3 files changed, 30 insertions(+), 4 deletions(-)
13
3 files changed, 19 insertions(+), 15 deletions(-)
14
rename hw/arm/{aspeed_soc.c => aspeed_ast2400.c} (95%)
25
15
26
diff --git a/include/hw/misc/aspeed_sdmc.h b/include/hw/misc/aspeed_sdmc.h
16
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
27
index XXXXXXX..XXXXXXX 100644
17
index XXXXXXX..XXXXXXX 100644
28
--- a/include/hw/misc/aspeed_sdmc.h
18
--- a/include/hw/arm/aspeed_soc.h
29
+++ b/include/hw/misc/aspeed_sdmc.h
19
+++ b/include/hw/arm/aspeed_soc.h
30
@@ -XXX,XX +XXX,XX @@
20
@@ -XXX,XX +XXX,XX @@
31
#define TYPE_ASPEED_2500_SDMC TYPE_ASPEED_SDMC "-ast2500"
21
struct AspeedSoCState {
32
#define TYPE_ASPEED_2600_SDMC TYPE_ASPEED_SDMC "-ast2600"
22
DeviceState parent;
33
23
34
-#define ASPEED_SDMC_NR_REGS (0x174 >> 2)
24
- ARMCPU cpu[ASPEED_CPUS_NUM];
35
+/*
25
MemoryRegion *memory;
36
+ * SDMC has 174 documented registers. In addition the u-boot device tree
26
MemoryRegion *dram_mr;
37
+ * describes the following regions:
27
MemoryRegion dram_container;
38
+ * - PHY status regs at offset 0x400, length 0x200
28
MemoryRegion sram;
39
+ * - PHY setting regs at offset 0x100, length 0x300
29
MemoryRegion spi_boot_container;
40
+ *
30
MemoryRegion spi_boot;
41
+ * There are two sets of MRS (Mode Registers) configuration in ast2600 memory
31
- AspeedVICState vic;
42
+ * system: one is in the SDRAM MC (memory controller) which is used in run
32
AspeedRtcState rtc;
43
+ * time, and the other is in the DDR-PHY IP which is used during DDR-PHY
33
AspeedTimerCtrlState timerctrl;
44
+ * training.
34
AspeedI2CState i2c;
45
+ */
35
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
46
+#define ASPEED_SDMC_NR_REGS (0x500 >> 2)
36
47
37
struct Aspeed2400SoCState {
48
typedef struct AspeedSDMCState {
38
AspeedSoCState parent;
49
/*< private >*/
39
+
50
diff --git a/hw/misc/aspeed_scu.c b/hw/misc/aspeed_scu.c
40
+ ARMCPU cpu[ASPEED_CPUS_NUM];
41
+ AspeedVICState vic;
42
};
43
44
#define TYPE_ASPEED2400_SOC "aspeed2400-soc"
45
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_ast2400.c
46
similarity index 95%
47
rename from hw/arm/aspeed_soc.c
48
rename to hw/arm/aspeed_ast2400.c
51
index XXXXXXX..XXXXXXX 100644
49
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/misc/aspeed_scu.c
50
--- a/hw/arm/aspeed_soc.c
53
+++ b/hw/misc/aspeed_scu.c
51
+++ b/hw/arm/aspeed_ast2400.c
54
@@ -XXX,XX +XXX,XX @@ static const uint32_t ast2600_a1_resets[ASPEED_AST2600_SCU_NR_REGS] = {
52
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2400_irqmap[] = {
55
[AST2600_SYS_RST_CTRL2] = 0xFFFFFFFC,
53
56
[AST2600_CLK_STOP_CTRL] = 0xFFFF7F8A,
54
static qemu_irq aspeed_soc_ast2400_get_irq(AspeedSoCState *s, int dev)
57
[AST2600_CLK_STOP_CTRL2] = 0xFFF0FFF0,
55
{
58
- [AST2600_SDRAM_HANDSHAKE] = 0x00000040, /* SoC completed DRAM init */
56
+ Aspeed2400SoCState *a = ASPEED2400_SOC(s);
59
+ [AST2600_SDRAM_HANDSHAKE] = 0x00000000,
57
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
60
[AST2600_HPLL_PARAM] = 0x1000405F,
58
61
[AST2600_CHIP_ID0] = 0x1234ABCD,
59
- return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[dev]);
62
[AST2600_CHIP_ID1] = 0x88884444,
60
+ return qdev_get_gpio_in(DEVICE(&a->vic), sc->irqmap[dev]);
63
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
61
}
64
index XXXXXXX..XXXXXXX 100644
62
65
--- a/hw/misc/aspeed_sdmc.c
63
static void aspeed_ast2400_soc_init(Object *obj)
66
+++ b/hw/misc/aspeed_sdmc.c
64
{
67
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_sdmc_read(void *opaque, hwaddr addr, unsigned size)
65
+ Aspeed2400SoCState *a = ASPEED2400_SOC(obj);
68
if (addr >= ARRAY_SIZE(s->regs)) {
66
AspeedSoCState *s = ASPEED_SOC(obj);
69
qemu_log_mask(LOG_GUEST_ERROR,
67
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
70
"%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
68
int i;
71
- __func__, addr);
69
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
72
+ __func__, addr * 4);
73
return 0;
74
}
70
}
75
71
76
@@ -XXX,XX +XXX,XX @@ static void aspeed_sdmc_reset(DeviceState *dev)
72
for (i = 0; i < sc->num_cpus; i++) {
77
73
- object_initialize_child(obj, "cpu[*]", &s->cpu[i], sc->cpu_type);
78
/* Set ram size bit and defaults values */
74
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
79
s->regs[R_CONF] = asc->compute_conf(s, 0);
80
+
81
+ /*
82
+ * PHY status:
83
+ * - set phy status ok (set bit 1)
84
+ * - initial PVT calibration ok (clear bit 3)
85
+ * - runtime calibration ok (clear bit 5)
86
+ */
87
+ s->regs[0x100] = BIT(1);
88
+
89
+ /* PHY eye window: set all as passing */
90
+ s->regs[0x100 | (0x68 / 4)] = 0xff;
91
+ s->regs[0x100 | (0x7c / 4)] = 0xff;
92
+ s->regs[0x100 | (0x50 / 4)] = 0xfffffff;
93
}
94
95
static void aspeed_sdmc_get_ram_size(Object *obj, Visitor *v, const char *name,
96
@@ -XXX,XX +XXX,XX @@ static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
97
}
75
}
98
76
99
if (reg != R_PROT && s->regs[R_PROT] == PROT_SOFTLOCKED) {
77
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
100
- qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked!\n", __func__);
78
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
101
+ qemu_log_mask(LOG_GUEST_ERROR,
79
object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu),
102
+ "%s: SDMC is locked! (write to MCR%02x blocked)\n",
80
"hw-prot-key");
103
+ __func__, reg * 4);
81
82
- object_initialize_child(obj, "vic", &s->vic, TYPE_ASPEED_VIC);
83
+ object_initialize_child(obj, "vic", &a->vic, TYPE_ASPEED_VIC);
84
85
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
86
87
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
88
static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
89
{
90
int i;
91
+ Aspeed2400SoCState *a = ASPEED2400_SOC(dev);
92
AspeedSoCState *s = ASPEED_SOC(dev);
93
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
94
Error *err = NULL;
95
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
96
97
/* CPU */
98
for (i = 0; i < sc->num_cpus; i++) {
99
- object_property_set_link(OBJECT(&s->cpu[i]), "memory",
100
+ object_property_set_link(OBJECT(&a->cpu[i]), "memory",
101
OBJECT(s->memory), &error_abort);
102
- if (!qdev_realize(DEVICE(&s->cpu[i]), NULL, errp)) {
103
+ if (!qdev_realize(DEVICE(&a->cpu[i]), NULL, errp)) {
104
return;
105
}
106
}
107
108
/* SRAM */
109
- sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&s->cpu[0])->cpu_index);
110
+ sram_name = g_strdup_printf("aspeed.sram.%d", CPU(&a->cpu[0])->cpu_index);
111
memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
112
if (err) {
113
error_propagate(errp, err);
114
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
115
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->scu), 0, sc->memmap[ASPEED_DEV_SCU]);
116
117
/* VIC */
118
- if (!sysbus_realize(SYS_BUS_DEVICE(&s->vic), errp)) {
119
+ if (!sysbus_realize(SYS_BUS_DEVICE(&a->vic), errp)) {
104
return;
120
return;
105
}
121
}
106
122
- aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->vic), 0, sc->memmap[ASPEED_DEV_VIC]);
123
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 0,
124
- qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_IRQ));
125
- sysbus_connect_irq(SYS_BUS_DEVICE(&s->vic), 1,
126
- qdev_get_gpio_in(DEVICE(&s->cpu), ARM_CPU_FIQ));
127
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&a->vic), 0, sc->memmap[ASPEED_DEV_VIC]);
128
+ sysbus_connect_irq(SYS_BUS_DEVICE(&a->vic), 0,
129
+ qdev_get_gpio_in(DEVICE(&a->cpu), ARM_CPU_IRQ));
130
+ sysbus_connect_irq(SYS_BUS_DEVICE(&a->vic), 1,
131
+ qdev_get_gpio_in(DEVICE(&a->cpu), ARM_CPU_FIQ));
132
133
/* RTC */
134
if (!sysbus_realize(SYS_BUS_DEVICE(&s->rtc), errp)) {
135
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
136
index XXXXXXX..XXXXXXX 100644
137
--- a/hw/arm/meson.build
138
+++ b/hw/arm/meson.build
139
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_FSL_IMX25', if_true: files('fsl-imx25.c', 'imx25_pdk.c'
140
arm_ss.add(when: 'CONFIG_FSL_IMX31', if_true: files('fsl-imx31.c', 'kzm.c'))
141
arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
142
arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
143
- 'aspeed_soc.c',
144
'aspeed.c',
145
'aspeed_soc_common.c',
146
+ 'aspeed_ast2400.c',
147
'aspeed_ast2600.c',
148
'aspeed_ast10x0.c',
149
'aspeed_eeprom.c',
107
--
150
--
108
2.25.4
151
2.41.0
109
152
110
153
diff view generated by jsdifflib
Deleted patch
1
From: Joel Stanley <joel@jms.id.au>
2
1
3
A subset of registers are not protected by the lock behaviour, so allow
4
unconditionally writing to those.
5
6
Signed-off-by: Joel Stanley <joel@jms.id.au>
7
Message-Id: <20200819100956.2216690-18-clg@kaod.org>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
10
hw/misc/aspeed_sdmc.c | 27 +++++++++++++++++++++++++++
11
1 file changed, 27 insertions(+)
12
13
diff --git a/hw/misc/aspeed_sdmc.c b/hw/misc/aspeed_sdmc.c
14
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/misc/aspeed_sdmc.c
16
+++ b/hw/misc/aspeed_sdmc.c
17
@@ -XXX,XX +XXX,XX @@
18
/* Configuration Register */
19
#define R_CONF (0x04 / 4)
20
21
+/* Interrupt control/status */
22
+#define R_ISR (0x50 / 4)
23
+
24
/* Control/Status Register #1 (ast2500) */
25
#define R_STATUS1 (0x60 / 4)
26
#define PHY_BUSY_STATE BIT(0)
27
#define PHY_PLL_LOCK_STATUS BIT(4)
28
29
+/* Reserved */
30
+#define R_MCR6C (0x6c / 4)
31
+
32
#define R_ECC_TEST_CTRL (0x70 / 4)
33
#define ECC_TEST_FINISHED BIT(12)
34
#define ECC_TEST_FAIL BIT(13)
35
36
+#define R_TEST_START_LEN (0x74 / 4)
37
+#define R_TEST_FAIL_DQ (0x78 / 4)
38
+#define R_TEST_INIT_VAL (0x7c / 4)
39
+#define R_DRAM_SW (0x88 / 4)
40
+#define R_DRAM_TIME (0x8c / 4)
41
+#define R_ECC_ERR_INJECT (0xb4 / 4)
42
+
43
/*
44
* Configuration register Ox4 (for Aspeed AST2400 SOC)
45
*
46
@@ -XXX,XX +XXX,XX @@ static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
47
static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
48
uint32_t data)
49
{
50
+ /* Unprotected registers */
51
+ switch (reg) {
52
+ case R_ISR:
53
+ case R_MCR6C:
54
+ case R_TEST_START_LEN:
55
+ case R_TEST_FAIL_DQ:
56
+ case R_TEST_INIT_VAL:
57
+ case R_DRAM_SW:
58
+ case R_DRAM_TIME:
59
+ case R_ECC_ERR_INJECT:
60
+ s->regs[reg] = data;
61
+ return;
62
+ }
63
+
64
if (s->regs[R_PROT] == PROT_HARDLOCKED) {
65
qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked until system reset!\n",
66
__func__);
67
--
68
2.25.4
69
70
diff view generated by jsdifflib