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 |