1
The following changes since commit a95260486aa7e78d7c7194eba65cf03311ad94ad:
1
The following changes since commit bd2e12310b18b51aefbf834e6d54989fd175976f:
2
2
3
Merge tag 'pull-tcg-20231023' of https://gitlab.com/rth7680/qemu into staging (2023-10-23 14:45:46 -0700)
3
Merge tag 'qga-pull-2024-01-30' of https://github.com/kostyanf14/qemu into staging (2024-01-30 15:53:46 +0000)
4
4
5
are available in the Git repository at:
5
are available in the Git repository at:
6
6
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20231025
7
https://github.com/legoater/qemu/ tags/pull-aspeed-20240201
8
8
9
for you to fetch changes up to dd41ce7a6f13ad4f45ebaf52b9fa91fe5fc961df:
9
for you to fetch changes up to 649b8ed20543f1b7f7e3dd8fd409092639bb345e:
10
10
11
hw/arm/aspeed: Move AspeedSoCState::cpu/vic to Aspeed2400SoCState (2023-10-25 09:52:44 +0200)
11
hw/fsi: Update MAINTAINER list (2024-02-01 08:33:18 +0100)
12
12
13
----------------------------------------------------------------
13
----------------------------------------------------------------
14
aspeed queue:
14
aspeed queue:
15
15
16
* Update of Andrew's email
16
* Update of buildroot images to 2023.11 (6.6.3 kernel)
17
* Split of AspeedSoCState per 2400/2600/10x0
17
* Check of the valid CPU type supported by aspeed machines
18
* Simplified models for the IBM's FSI bus and the Aspeed
19
controller bridge
18
20
21
Changes since v1:
22
23
- Endianness fix
24
- Renamed test file to match other filenames
25
- Fixed file list in MAINTAINER
26
19
----------------------------------------------------------------
27
----------------------------------------------------------------
20
Andrew Jeffery (1):
28
Cédric Le Goater (1):
21
MAINTAINERS: aspeed: Update Andrew's email address
29
tests/avocado/machine_aspeed.py: Update buildroot images to 2023.11
22
30
23
Philippe Mathieu-Daudé (11):
31
Ninad Palsule (11):
24
hw/arm/aspeed: Extract code common to all boards to a common file
32
hw/fsi: Introduce IBM's Local bus
25
hw/arm/aspeed: Rename aspeed_soc_init() as AST2400/2500 specific
33
hw/fsi: Introduce IBM's scratchpad device
26
hw/arm/aspeed: Rename aspeed_soc_realize() as AST2400/2500 specific
34
hw/fsi: Introduce IBM's FSI Bus
27
hw/arm/aspeed: Dynamically allocate AspeedMachineState::soc field
35
hw/fsi: Introduce IBM's fsi-slave model
28
hw/arm/aspeed: Introduce TYPE_ASPEED10X0_SOC
36
hw/fsi: Introduce IBM's cfam
29
hw/arm/aspeed: Introduce TYPE_ASPEED2600_SOC
37
hw/fsi: Introduce IBM's FSI master
30
hw/arm/aspeed: Introduce TYPE_ASPEED2400_SOC
38
hw/fsi: Aspeed APB2OPB & On-chip peripheral bus
31
hw/arm/aspeed: Check 'memory' link is set in common aspeed_soc_realize
39
hw/arm: Hook up FSI module in AST2600
32
hw/arm/aspeed: Move AspeedSoCState::armv7m to Aspeed10x0SoCState
40
hw/fsi: Added qtest
33
hw/arm/aspeed: Move AspeedSoCState::a7mpcore to Aspeed2600SoCState
41
hw/fsi: Added FSI documentation
34
hw/arm/aspeed: Move AspeedSoCState::cpu/vic to Aspeed2400SoCState
42
hw/fsi: Update MAINTAINER list
35
43
36
MAINTAINERS | 2 +-
44
Philippe Mathieu-Daudé (5):
37
include/hw/arm/aspeed_soc.h | 35 +++++-
45
hw/arm/aspeed: Remove dead code
38
hw/arm/aspeed.c | 101 +++++++--------
46
hw/arm/aspeed: Set default CPU count using aspeed_soc_num_cpus()
39
hw/arm/aspeed_ast10x0.c | 53 ++++----
47
hw/arm/aspeed: Init CPU defaults in a common helper
40
hw/arm/{aspeed_soc.c => aspeed_ast2400.c} | 197 +++++++-----------------------
48
hw/arm/aspeed: Introduce aspeed_soc_cpu_type() helper
41
hw/arm/aspeed_ast2600.c | 75 ++++++------
49
hw/arm/aspeed: Check for CPU types in machine_run_board_init()
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
50
51
MAINTAINERS | 9 +
52
docs/specs/fsi.rst | 122 +++++++++++++
53
docs/specs/index.rst | 1 +
54
meson.build | 1 +
55
hw/fsi/trace.h | 1 +
56
include/hw/arm/aspeed_soc.h | 8 +-
57
include/hw/fsi/aspeed_apb2opb.h | 46 +++++
58
include/hw/fsi/cfam.h | 34 ++++
59
include/hw/fsi/fsi-master.h | 32 ++++
60
include/hw/fsi/fsi.h | 37 ++++
61
include/hw/fsi/lbus.h | 43 +++++
62
hw/arm/aspeed.c | 70 ++++----
63
hw/arm/aspeed_ast10x0.c | 8 +-
64
hw/arm/aspeed_ast2400.c | 15 +-
65
hw/arm/aspeed_ast2600.c | 28 ++-
66
hw/arm/aspeed_soc_common.c | 8 +
67
hw/fsi/aspeed_apb2opb.c | 367 ++++++++++++++++++++++++++++++++++++++++
68
hw/fsi/cfam.c | 168 ++++++++++++++++++
69
hw/fsi/fsi-master.c | 170 +++++++++++++++++++
70
hw/fsi/fsi.c | 102 +++++++++++
71
hw/fsi/lbus.c | 117 +++++++++++++
72
tests/qtest/aspeed_fsi-test.c | 205 ++++++++++++++++++++++
73
hw/Kconfig | 1 +
74
hw/arm/Kconfig | 1 +
75
hw/fsi/Kconfig | 7 +
76
hw/fsi/meson.build | 2 +
77
hw/fsi/trace-events | 13 ++
78
hw/meson.build | 1 +
79
tests/avocado/machine_aspeed.py | 18 +-
80
tests/qtest/meson.build | 1 +
81
30 files changed, 1578 insertions(+), 58 deletions(-)
82
create mode 100644 docs/specs/fsi.rst
83
create mode 100644 hw/fsi/trace.h
84
create mode 100644 include/hw/fsi/aspeed_apb2opb.h
85
create mode 100644 include/hw/fsi/cfam.h
86
create mode 100644 include/hw/fsi/fsi-master.h
87
create mode 100644 include/hw/fsi/fsi.h
88
create mode 100644 include/hw/fsi/lbus.h
89
create mode 100644 hw/fsi/aspeed_apb2opb.c
90
create mode 100644 hw/fsi/cfam.c
91
create mode 100644 hw/fsi/fsi-master.c
92
create mode 100644 hw/fsi/fsi.c
93
create mode 100644 hw/fsi/lbus.c
94
create mode 100644 tests/qtest/aspeed_fsi-test.c
95
create mode 100644 hw/fsi/Kconfig
96
create mode 100644 hw/fsi/meson.build
97
create mode 100644 hw/fsi/trace-events
98
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
Compared to mainline buildroot, these images have some customization :
2
2
3
The ARM array and VIC peripheral are only used by the
3
- Linux version is bumped to 6.6.3 and built with a custom config
4
2400 series, remove them from the common AspeedSoCState.
4
- U-Boot is switched to the one provided by OpenBMC for more support
5
- defconfigs extra tools for dev
5
6
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
See branch [1] for more details.
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
9
There are a few changes since last update, commit ed1f5ff84209. Images
10
all have a password now and I2C devices have been updated in the Linux
11
ast2600-evb device tree [2]. Do the necessary adjustements.
12
13
[1] https://github.com/legoater/buildroot/commits/aspeed-2023.11
14
[2] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9deb10cf160e
15
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
17
---
10
include/hw/arm/aspeed_soc.h | 5 +++--
18
tests/avocado/machine_aspeed.py | 18 +++++++++---------
11
hw/arm/{aspeed_soc.c => aspeed_ast2400.c} | 27 +++++++++++++----------
19
1 file changed, 9 insertions(+), 9 deletions(-)
12
hw/arm/meson.build | 2 +-
13
3 files changed, 19 insertions(+), 15 deletions(-)
14
rename hw/arm/{aspeed_soc.c => aspeed_ast2400.c} (95%)
15
20
16
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
21
diff --git a/tests/avocado/machine_aspeed.py b/tests/avocado/machine_aspeed.py
17
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
18
--- a/include/hw/arm/aspeed_soc.h
23
--- a/tests/avocado/machine_aspeed.py
19
+++ b/include/hw/arm/aspeed_soc.h
24
+++ b/tests/avocado/machine_aspeed.py
20
@@ -XXX,XX +XXX,XX @@
25
@@ -XXX,XX +XXX,XX @@ def do_test_arm_aspeed_buildroot_start(self, image, cpu_id, pattern='Aspeed EVB'
21
struct AspeedSoCState {
26
time.sleep(0.1)
22
DeviceState parent;
27
exec_command(self, 'root')
23
28
time.sleep(0.1)
24
- ARMCPU cpu[ASPEED_CPUS_NUM];
29
+ exec_command(self, "passw0rd")
25
MemoryRegion *memory;
30
26
MemoryRegion *dram_mr;
31
def do_test_arm_aspeed_buildroot_poweroff(self):
27
MemoryRegion dram_container;
32
exec_command_and_wait_for_pattern(self, 'poweroff',
28
MemoryRegion sram;
33
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2500_evb_buildroot(self):
29
MemoryRegion spi_boot_container;
34
"""
30
MemoryRegion spi_boot;
35
31
- AspeedVICState vic;
36
image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
32
AspeedRtcState rtc;
37
- 'images/ast2500-evb/buildroot-2022.11-2-g15d3648df9/flash.img')
33
AspeedTimerCtrlState timerctrl;
38
- image_hash = ('f96d11db521fe7a2787745e9e391225deeeec3318ee0fc07c8b799b8833dd474')
34
AspeedI2CState i2c;
39
+ 'images/ast2500-evb/buildroot-2023.11/flash.img')
35
@@ -XXX,XX +XXX,XX @@ OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
40
+ image_hash = ('c23db6160cf77d0258397eb2051162c8473a56c441417c52a91ba217186e715f')
36
41
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
37
struct Aspeed2400SoCState {
42
algorithm='sha256')
38
AspeedSoCState parent;
43
39
+
44
self.vm.add_args('-device',
40
+ ARMCPU cpu[ASPEED_CPUS_NUM];
45
'tmp105,bus=aspeed.i2c.bus.3,address=0x4d,id=tmp-test');
41
+ AspeedVICState vic;
46
- self.do_test_arm_aspeed_buildroot_start(image_path, '0x0')
42
};
47
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0x0', 'Aspeed AST2500 EVB')
43
48
44
#define TYPE_ASPEED2400_SOC "aspeed2400-soc"
49
exec_command_and_wait_for_pattern(self,
45
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_ast2400.c
50
'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
46
similarity index 95%
51
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_buildroot(self):
47
rename from hw/arm/aspeed_soc.c
52
"""
48
rename to hw/arm/aspeed_ast2400.c
53
49
index XXXXXXX..XXXXXXX 100644
54
image_url = ('https://github.com/legoater/qemu-aspeed-boot/raw/master/'
50
--- a/hw/arm/aspeed_soc.c
55
- 'images/ast2600-evb/buildroot-2022.11-2-g15d3648df9/flash.img')
51
+++ b/hw/arm/aspeed_ast2400.c
56
- image_hash = ('e598d86e5ea79671ca8b59212a326c911bc8bea728dec1a1f5390d717a28bb8b')
52
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2400_irqmap[] = {
57
+ 'images/ast2600-evb/buildroot-2023.11/flash.img')
53
58
+ image_hash = ('b62808daef48b438d0728ee07662290490ecfa65987bb91294cafb1bb7ad1a68')
54
static qemu_irq aspeed_soc_ast2400_get_irq(AspeedSoCState *s, int dev)
59
image_path = self.fetch_asset(image_url, asset_hash=image_hash,
55
{
60
algorithm='sha256')
56
+ Aspeed2400SoCState *a = ASPEED2400_SOC(s);
61
57
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
62
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_buildroot(self):
58
63
'ds1338,bus=aspeed.i2c.bus.3,address=0x32');
59
- return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[dev]);
64
self.vm.add_args('-device',
60
+ return qdev_get_gpio_in(DEVICE(&a->vic), sc->irqmap[dev]);
65
'i2c-echo,bus=aspeed.i2c.bus.3,address=0x42');
61
}
66
- self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00')
62
67
+ self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
63
static void aspeed_ast2400_soc_init(Object *obj)
68
64
{
69
exec_command_and_wait_for_pattern(self,
65
+ Aspeed2400SoCState *a = ASPEED2400_SOC(obj);
70
'echo lm75 0x4d > /sys/class/i2c-dev/i2c-3/device/new_device',
66
AspeedSoCState *s = ASPEED_SOC(obj);
71
'i2c i2c-3: new_device: Instantiated device lm75 at 0x4d');
67
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
72
exec_command_and_wait_for_pattern(self,
68
int i;
73
- 'cat /sys/class/hwmon/hwmon0/temp1_input', '0')
69
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
74
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '0')
70
}
75
self.vm.cmd('qom-set', path='/machine/peripheral/tmp-test',
71
76
property='temperature', value=18000);
72
for (i = 0; i < sc->num_cpus; i++) {
77
exec_command_and_wait_for_pattern(self,
73
- object_initialize_child(obj, "cpu[*]", &s->cpu[i], sc->cpu_type);
78
- 'cat /sys/class/hwmon/hwmon0/temp1_input', '18000')
74
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
79
+ 'cat /sys/class/hwmon/hwmon1/temp1_input', '18000')
75
}
80
76
81
exec_command_and_wait_for_pattern(self,
77
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
82
'echo ds1307 0x32 > /sys/class/i2c-dev/i2c-3/device/new_device',
78
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
83
@@ -XXX,XX +XXX,XX @@ def test_arm_ast2600_evb_buildroot_tpm(self):
79
object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu),
84
self.vm.add_args('-device',
80
"hw-prot-key");
85
'tpm-tis-i2c,tpmdev=tpm0,bus=aspeed.i2c.bus.12,address=0x2e')
81
86
self.do_test_arm_aspeed_buildroot_start(image_path, '0xf00', 'Aspeed AST2600 EVB')
82
- object_initialize_child(obj, "vic", &s->vic, TYPE_ASPEED_VIC);
87
- exec_command(self, "passw0rd")
83
+ object_initialize_child(obj, "vic", &a->vic, TYPE_ASPEED_VIC);
88
84
89
exec_command_and_wait_for_pattern(self,
85
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
90
'echo tpm_tis_i2c 0x2e > /sys/bus/i2c/devices/i2c-12/new_device',
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)) {
120
return;
121
}
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',
150
--
91
--
151
2.41.0
92
2.43.0
152
93
153
94
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The v7-M core is specific to the Aspeed 10x0 series,
3
Remove copy/paste typo from commit 6c323aba40 ("hw/arm/aspeed:
4
remove it from the common AspeedSoCState.
4
Adding new machine Tiogapass in QEMU").
5
5
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
9
Reviewed-by: Gavin Shan <gshan@redhat.com>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
11
---
10
include/hw/arm/aspeed_soc.h | 5 ++---
12
hw/arm/aspeed.c | 1 -
11
hw/arm/aspeed_ast10x0.c | 27 +++++++++++++++------------
13
1 file changed, 1 deletion(-)
12
hw/arm/fby35.c | 13 ++++++++-----
13
3 files changed, 25 insertions(+), 20 deletions(-)
14
14
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
16
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/aspeed_soc.h
17
--- a/hw/arm/aspeed.c
18
+++ b/include/hw/arm/aspeed_soc.h
18
+++ b/hw/arm/aspeed.c
19
@@ -XXX,XX +XXX,XX @@
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
20
#define ASPEED_JTAG_NUM 2
20
mc->default_ram_size = 1 * GiB;
21
21
mc->default_cpus = mc->min_cpus = mc->max_cpus =
22
struct AspeedSoCState {
22
aspeed_soc_num_cpus(amc->soc_name);
23
- /*< private >*/
23
- aspeed_soc_num_cpus(amc->soc_name);
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
};
24
};
40
25
41
#define TYPE_ASPEED10X0_SOC "aspeed10x0-soc"
26
static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
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]);
55
}
56
57
static void aspeed_soc_ast1030_init(Object *obj)
58
{
59
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(obj);
60
AspeedSoCState *s = ASPEED_SOC(obj);
61
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
62
char socname[8];
63
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
64
g_assert_not_reached();
65
}
66
67
- object_initialize_child(obj, "armv7m", &s->armv7m, TYPE_ARMV7M);
68
+ object_initialize_child(obj, "armv7m", &a->armv7m, TYPE_ARMV7M);
69
70
s->sysclk = qdev_init_clock_in(DEVICE(s), "sysclk", NULL, NULL, 0);
71
72
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_init(Object *obj)
73
74
static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
75
{
76
+ Aspeed10x0SoCState *a = ASPEED10X0_SOC(dev_soc);
77
AspeedSoCState *s = ASPEED_SOC(dev_soc);
78
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
79
DeviceState *armv7m;
80
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
81
0x40000);
82
83
/* AST1030 CPU Core */
84
- armv7m = DEVICE(&s->armv7m);
85
+ armv7m = DEVICE(&a->armv7m);
86
qdev_prop_set_uint32(armv7m, "num-irq", 256);
87
qdev_prop_set_string(armv7m, "cpu-type", sc->cpu_type);
88
qdev_connect_clock_in(armv7m, "cpuclk", s->sysclk);
89
- object_property_set_link(OBJECT(&s->armv7m), "memory",
90
+ object_property_set_link(OBJECT(&a->armv7m), "memory",
91
OBJECT(s->memory), &error_abort);
92
- sysbus_realize(SYS_BUS_DEVICE(&s->armv7m), &error_abort);
93
+ sysbus_realize(SYS_BUS_DEVICE(&a->armv7m), &error_abort);
94
95
/* Internal SRAM */
96
sram_name = g_strdup_printf("aspeed.sram.%d",
97
- CPU(s->armv7m.cpu)->cpu_index);
98
+ CPU(a->armv7m.cpu)->cpu_index);
99
memory_region_init_ram(&s->sram, OBJECT(s), sram_name, sc->sram_size, &err);
100
if (err != NULL) {
101
error_propagate(errp, err);
102
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
103
}
104
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->i2c), 0, sc->memmap[ASPEED_DEV_I2C]);
105
for (i = 0; i < ASPEED_I2C_GET_CLASS(&s->i2c)->num_busses; i++) {
106
- qemu_irq irq = qdev_get_gpio_in(DEVICE(&s->armv7m),
107
+ qemu_irq irq = qdev_get_gpio_in(DEVICE(&a->armv7m),
108
sc->irqmap[ASPEED_DEV_I2C] + i);
109
/* The AST1030 I2C controller has one IRQ per bus. */
110
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i2c.busses[i]), 0, irq);
111
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
112
}
113
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->i3c), 0, sc->memmap[ASPEED_DEV_I3C]);
114
for (i = 0; i < ASPEED_I3C_NR_DEVICES; i++) {
115
- qemu_irq irq = qdev_get_gpio_in(DEVICE(&s->armv7m),
116
+ qemu_irq irq = qdev_get_gpio_in(DEVICE(&a->armv7m),
117
sc->irqmap[ASPEED_DEV_I3C] + i);
118
/* The AST1030 I3C controller has one IRQ per bus. */
119
sysbus_connect_irq(SYS_BUS_DEVICE(&s->i3c.devices[i]), 0, irq);
120
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
121
* On the AST1030 LPC subdevice IRQs are connected straight to the GIC.
122
*/
123
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_1,
124
- qdev_get_gpio_in(DEVICE(&s->armv7m),
125
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
126
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_1));
127
128
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_2,
129
- qdev_get_gpio_in(DEVICE(&s->armv7m),
130
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
131
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_2));
132
133
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_3,
134
- qdev_get_gpio_in(DEVICE(&s->armv7m),
135
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
136
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_3));
137
138
sysbus_connect_irq(SYS_BUS_DEVICE(&s->lpc), 1 + aspeed_lpc_kcs_4,
139
- qdev_get_gpio_in(DEVICE(&s->armv7m),
140
+ qdev_get_gpio_in(DEVICE(&a->armv7m),
141
sc->irqmap[ASPEED_DEV_KCS] + aspeed_lpc_kcs_4));
142
143
/* UART */
144
diff --git a/hw/arm/fby35.c b/hw/arm/fby35.c
145
index XXXXXXX..XXXXXXX 100644
146
--- a/hw/arm/fby35.c
147
+++ b/hw/arm/fby35.c
148
@@ -XXX,XX +XXX,XX @@ struct Fby35State {
149
Clock *bic_sysclk;
150
151
AspeedSoCState bmc;
152
- AspeedSoCState bic;
153
+ Aspeed10x0SoCState bic;
154
155
bool mmio_exec;
156
};
157
@@ -XXX,XX +XXX,XX @@ static void fby35_bmc_init(Fby35State *s)
158
159
static void fby35_bic_init(Fby35State *s)
160
{
161
+ AspeedSoCState *soc;
162
+
163
s->bic_sysclk = clock_new(OBJECT(s), "SYSCLK");
164
clock_set_hz(s->bic_sysclk, 200000000ULL);
165
166
object_initialize_child(OBJECT(s), "bic", &s->bic, "ast1030-a1");
167
+ soc = ASPEED_SOC(&s->bic);
168
169
memory_region_init(&s->bic_memory, OBJECT(&s->bic), "bic-memory",
170
UINT64_MAX);
171
@@ -XXX,XX +XXX,XX @@ static void fby35_bic_init(Fby35State *s)
172
qdev_connect_clock_in(DEVICE(&s->bic), "sysclk", s->bic_sysclk);
173
object_property_set_link(OBJECT(&s->bic), "memory", OBJECT(&s->bic_memory),
174
&error_abort);
175
- aspeed_soc_uart_set_chr(&s->bic, ASPEED_DEV_UART5, serial_hd(1));
176
+ aspeed_soc_uart_set_chr(soc, ASPEED_DEV_UART5, serial_hd(1));
177
qdev_realize(DEVICE(&s->bic), NULL, &error_abort);
178
179
- aspeed_board_init_flashes(&s->bic.fmc, "sst25vf032b", 2, 2);
180
- aspeed_board_init_flashes(&s->bic.spi[0], "sst25vf032b", 2, 4);
181
- aspeed_board_init_flashes(&s->bic.spi[1], "sst25vf032b", 2, 6);
182
+ aspeed_board_init_flashes(&soc->fmc, "sst25vf032b", 2, 2);
183
+ aspeed_board_init_flashes(&soc->spi[0], "sst25vf032b", 2, 4);
184
+ aspeed_board_init_flashes(&soc->spi[1], "sst25vf032b", 2, 6);
185
}
186
187
static void fby35_init(MachineState *machine)
188
--
27
--
189
2.41.0
28
2.43.0
190
29
191
30
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
Keep aspeed_soc_class_init() generic, set the realize handler
3
Since commit b7f1a0cb76 ("arm/aspeed: Compute the number
4
to aspeed_ast2400_soc_realize() in each 2400/2500 class_init.
4
of CPUs from the SoC definition") Aspeed machines use the
5
aspeed_soc_num_cpus() helper to set the number of CPUs.
6
7
Use it for the ast1030-evb (commit 356b230ed1 "aspeed/soc:
8
Add AST1030 support") and supermicrox11-bmc (commit 40a38df55e
9
"hw/arm/aspeed: Add board model for Supermicro X11 BMC") machines.
5
10
6
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: Gavin Shan <gshan@redhat.com>
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
15
---
10
hw/arm/aspeed_soc.c | 15 +++++++++++----
16
hw/arm/aspeed.c | 5 ++++-
11
1 file changed, 11 insertions(+), 4 deletions(-)
17
1 file changed, 4 insertions(+), 1 deletion(-)
12
18
13
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
19
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
14
index XXXXXXX..XXXXXXX 100644
20
index XXXXXXX..XXXXXXX 100644
15
--- a/hw/arm/aspeed_soc.c
21
--- a/hw/arm/aspeed.c
16
+++ b/hw/arm/aspeed_soc.c
22
+++ b/hw/arm/aspeed.c
17
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
18
object_initialize_child(obj, "video", &s->video, TYPE_UNIMPLEMENTED_DEVICE);
24
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
25
amc->i2c_init = palmetto_bmc_i2c_init;
26
mc->default_ram_size = 256 * MiB;
27
+ mc->default_cpus = mc->min_cpus = mc->max_cpus =
28
+ aspeed_soc_num_cpus(amc->soc_name);
19
}
29
}
20
30
21
-static void aspeed_soc_realize(DeviceState *dev, Error **errp)
31
static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
22
+static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
32
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
23
{
33
mc->init = aspeed_minibmc_machine_init;
24
int i;
34
amc->i2c_init = ast1030_evb_i2c_init;
25
AspeedSoCState *s = ASPEED_SOC(dev);
35
mc->default_ram_size = 0;
26
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
36
- mc->default_cpus = mc->min_cpus = mc->max_cpus = 1;
27
{
37
amc->fmc_model = "sst25vf032b";
28
DeviceClass *dc = DEVICE_CLASS(oc);
38
amc->spi_model = "sst25vf032b";
29
39
amc->num_cs = 2;
30
- dc->realize = aspeed_soc_realize;
40
amc->macs_mask = 0;
31
- /* Reason: Uses serial_hds and nd_table in realize() directly */
41
+ mc->default_cpus = mc->min_cpus = mc->max_cpus =
32
- dc->user_creatable = false;
42
+ aspeed_soc_num_cpus(amc->soc_name);
33
device_class_set_props(dc, aspeed_soc_properties);
34
}
43
}
35
44
36
@@ -XXX,XX +XXX,XX @@ static const TypeInfo aspeed_soc_type_info = {
45
static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
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");
60
--
46
--
61
2.41.0
47
2.43.0
62
48
63
49
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
We want to derivate the big AspeedSoCState object in some more
3
Rework aspeed_soc_num_cpus() as a new init_cpus_defaults()
4
SoC-specific ones. Since the object size will vary, allocate it
4
helper to reduce code duplication.
5
dynamically.
5
6
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
8
Reviewed-by: Gavin Shan <gshan@redhat.com>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
9
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
11
---
11
hw/arm/aspeed.c | 101 +++++++++++++++++++++++++-----------------------
12
hw/arm/aspeed.c | 71 +++++++++++++++++++------------------------------
12
1 file changed, 52 insertions(+), 49 deletions(-)
13
1 file changed, 28 insertions(+), 43 deletions(-)
13
14
14
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
15
index XXXXXXX..XXXXXXX 100644
16
index XXXXXXX..XXXXXXX 100644
16
--- a/hw/arm/aspeed.c
17
--- a/hw/arm/aspeed.c
17
+++ b/hw/arm/aspeed.c
18
+++ b/hw/arm/aspeed.c
18
@@ -XXX,XX +XXX,XX @@ struct AspeedMachineState {
19
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_class_props_init(ObjectClass *oc)
19
MachineState parent_obj;
20
"Change the SPI Flash model");
20
/* Public */
21
}
21
22
22
- AspeedSoCState soc;
23
-static int aspeed_soc_num_cpus(const char *soc_name)
23
+ AspeedSoCState *soc;
24
+static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
24
MemoryRegion boot_rom;
25
bool mmio_exec;
26
uint32_t uart_chosen;
27
@@ -XXX,XX +XXX,XX @@ static void write_boot_rom(BlockBackend *blk, hwaddr addr, size_t rom_size,
28
static void aspeed_install_boot_rom(AspeedMachineState *bmc, BlockBackend *blk,
29
uint64_t rom_size)
30
{
25
{
31
- AspeedSoCState *soc = &bmc->soc;
26
- AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(soc_name));
32
+ AspeedSoCState *soc = bmc->soc;
27
- return sc->num_cpus;
33
28
+ AspeedMachineClass *amc = ASPEED_MACHINE_CLASS(mc);
34
memory_region_init_rom(&bmc->boot_rom, NULL, "aspeed.boot_rom", rom_size,
29
+ AspeedSoCClass *sc = ASPEED_SOC_CLASS(object_class_by_name(amc->soc_name));
35
&error_abort);
30
+
36
@@ -XXX,XX +XXX,XX @@ static void sdhci_attach_drive(SDHCIState *sdhci, DriveInfo *dinfo)
31
+ mc->default_cpus = sc->num_cpus;
37
static void connect_serial_hds_to_uarts(AspeedMachineState *bmc)
32
+ mc->min_cpus = sc->num_cpus;
38
{
33
+ mc->max_cpus = sc->num_cpus;
39
AspeedMachineClass *amc = ASPEED_MACHINE_GET_CLASS(bmc);
34
}
40
- AspeedSoCState *s = &bmc->soc;
35
41
+ AspeedSoCState *s = bmc->soc;
36
static void aspeed_machine_class_init(ObjectClass *oc, void *data)
42
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_palmetto_class_init(ObjectClass *oc, void *data)
43
int uart_chosen = bmc->uart_chosen ? bmc->uart_chosen : amc->uart_default;
38
amc->num_cs = 1;
44
39
amc->i2c_init = palmetto_bmc_i2c_init;
45
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
40
mc->default_ram_size = 256 * MiB;
46
int i;
41
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
47
NICInfo *nd = &nd_table[0];
42
- aspeed_soc_num_cpus(amc->soc_name);
48
43
+ aspeed_machine_class_init_cpus_defaults(mc);
49
- object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
44
};
50
-
45
51
- sc = ASPEED_SOC_GET_CLASS(&bmc->soc);
46
static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
52
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
47
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_quanta_q71l_class_init(ObjectClass *oc, void *data)
53
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
48
amc->num_cs = 1;
54
+ object_unref(OBJECT(bmc->soc));
49
amc->i2c_init = quanta_q71l_bmc_i2c_init;
55
+ sc = ASPEED_SOC_GET_CLASS(bmc->soc);
50
mc->default_ram_size = 128 * MiB;
56
51
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
57
/*
52
- aspeed_soc_num_cpus(amc->soc_name);
58
* This will error out if the RAM size is not supported by the
53
+ aspeed_machine_class_init_cpus_defaults(mc);
59
* memory controller of the SoC.
54
}
60
*/
55
61
- object_property_set_uint(OBJECT(&bmc->soc), "ram-size", machine->ram_size,
56
static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
62
+ object_property_set_uint(OBJECT(bmc->soc), "ram-size", machine->ram_size,
57
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_supermicrox11_bmc_class_init(ObjectClass *oc,
63
&error_fatal);
58
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
64
59
amc->i2c_init = palmetto_bmc_i2c_init;
65
for (i = 0; i < sc->macs_num; i++) {
60
mc->default_ram_size = 256 * MiB;
66
if ((amc->macs_mask & (1 << i)) && nd->used) {
61
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
67
qemu_check_nic_model(nd, TYPE_FTGMAC100);
62
- aspeed_soc_num_cpus(amc->soc_name);
68
- qdev_set_nic_properties(DEVICE(&bmc->soc.ftgmac100[i]), nd);
63
+ aspeed_machine_class_init_cpus_defaults(mc);
69
+ qdev_set_nic_properties(DEVICE(&bmc->soc->ftgmac100[i]), nd);
64
}
70
nd++;
65
71
}
66
static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
72
}
67
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_supermicro_x11spi_bmc_class_init(ObjectClass *oc,
73
68
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
74
- object_property_set_int(OBJECT(&bmc->soc), "hw-strap1", amc->hw_strap1,
69
amc->i2c_init = palmetto_bmc_i2c_init;
75
+ object_property_set_int(OBJECT(bmc->soc), "hw-strap1", amc->hw_strap1,
70
mc->default_ram_size = 512 * MiB;
76
&error_abort);
71
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
77
- object_property_set_int(OBJECT(&bmc->soc), "hw-strap2", amc->hw_strap2,
72
- aspeed_soc_num_cpus(amc->soc_name);
78
+ object_property_set_int(OBJECT(bmc->soc), "hw-strap2", amc->hw_strap2,
73
+ aspeed_machine_class_init_cpus_defaults(mc);
79
&error_abort);
74
}
80
- object_property_set_link(OBJECT(&bmc->soc), "memory",
75
81
+ object_property_set_link(OBJECT(bmc->soc), "memory",
76
static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
82
OBJECT(get_system_memory()), &error_abort);
77
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2500_evb_class_init(ObjectClass *oc, void *data)
83
- object_property_set_link(OBJECT(&bmc->soc), "dram",
78
amc->num_cs = 1;
84
+ object_property_set_link(OBJECT(bmc->soc), "dram",
79
amc->i2c_init = ast2500_evb_i2c_init;
85
OBJECT(machine->ram), &error_abort);
80
mc->default_ram_size = 512 * MiB;
86
if (machine->kernel_filename) {
81
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
87
/*
82
- aspeed_soc_num_cpus(amc->soc_name);
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
83
+ aspeed_machine_class_init_cpus_defaults(mc);
89
* that runs to unlock the SCU. In this case set the default to
84
};
90
* be unlocked as the kernel expects
85
91
*/
86
static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
92
- object_property_set_int(OBJECT(&bmc->soc), "hw-prot-key",
87
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_yosemitev2_class_init(ObjectClass *oc, void *data)
93
+ object_property_set_int(OBJECT(bmc->soc), "hw-prot-key",
88
amc->num_cs = 2;
94
ASPEED_SCU_PROT_KEY, &error_abort);
89
amc->i2c_init = yosemitev2_bmc_i2c_init;
95
}
90
mc->default_ram_size = 512 * MiB;
96
connect_serial_hds_to_uarts(bmc);
91
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
97
- qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
92
- aspeed_soc_num_cpus(amc->soc_name);
98
+ qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
93
+ aspeed_machine_class_init_cpus_defaults(mc);
99
94
};
100
if (defaults_enabled()) {
95
101
- aspeed_board_init_flashes(&bmc->soc.fmc,
96
static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
102
+ aspeed_board_init_flashes(&bmc->soc->fmc,
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_romulus_class_init(ObjectClass *oc, void *data)
103
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
98
amc->num_cs = 2;
104
amc->num_cs, 0);
99
amc->i2c_init = romulus_bmc_i2c_init;
105
- aspeed_board_init_flashes(&bmc->soc.spi[0],
100
mc->default_ram_size = 512 * MiB;
106
+ aspeed_board_init_flashes(&bmc->soc->spi[0],
101
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
107
bmc->spi_model ? bmc->spi_model : amc->spi_model,
102
- aspeed_soc_num_cpus(amc->soc_name);
108
1, amc->num_cs);
103
+ aspeed_machine_class_init_cpus_defaults(mc);
109
}
104
};
110
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
105
111
amc->i2c_init(bmc);
106
static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
112
}
107
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_tiogapass_class_init(ObjectClass *oc, void *data)
113
108
amc->num_cs = 2;
114
- for (i = 0; i < bmc->soc.sdhci.num_slots; i++) {
109
amc->i2c_init = tiogapass_bmc_i2c_init;
115
- sdhci_attach_drive(&bmc->soc.sdhci.slots[i],
110
mc->default_ram_size = 1 * GiB;
116
+ for (i = 0; i < bmc->soc->sdhci.num_slots; i++) {
111
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
117
+ sdhci_attach_drive(&bmc->soc->sdhci.slots[i],
112
- aspeed_soc_num_cpus(amc->soc_name);
118
drive_get(IF_SD, 0, i));
113
+ aspeed_machine_class_init_cpus_defaults(mc);
119
}
114
};
120
115
121
- if (bmc->soc.emmc.num_slots) {
116
static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
122
- sdhci_attach_drive(&bmc->soc.emmc.slots[0],
117
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_sonorapass_class_init(ObjectClass *oc, void *data)
123
- drive_get(IF_SD, 0, bmc->soc.sdhci.num_slots));
118
amc->num_cs = 2;
124
+ if (bmc->soc->emmc.num_slots) {
119
amc->i2c_init = sonorapass_bmc_i2c_init;
125
+ sdhci_attach_drive(&bmc->soc->emmc.slots[0],
120
mc->default_ram_size = 512 * MiB;
126
+ drive_get(IF_SD, 0, bmc->soc->sdhci.num_slots));
121
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
127
}
122
- aspeed_soc_num_cpus(amc->soc_name);
128
123
+ aspeed_machine_class_init_cpus_defaults(mc);
129
if (!bmc->mmio_exec) {
124
};
130
- DeviceState *dev = ssi_get_cs(bmc->soc.fmc.spi, 0);
125
131
+ DeviceState *dev = ssi_get_cs(bmc->soc->fmc.spi, 0);
126
static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
132
BlockBackend *fmc0 = dev ? m25p80_get_blk(dev) : NULL;
127
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_witherspoon_class_init(ObjectClass *oc, void *data)
133
128
amc->num_cs = 2;
134
if (fmc0) {
129
amc->i2c_init = witherspoon_bmc_i2c_init;
135
- uint64_t rom_size = memory_region_size(&bmc->soc.spi_boot);
130
mc->default_ram_size = 512 * MiB;
136
+ uint64_t rom_size = memory_region_size(&bmc->soc->spi_boot);
131
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
137
aspeed_install_boot_rom(bmc, fmc0, rom_size);
132
- aspeed_soc_num_cpus(amc->soc_name);
138
}
133
+ aspeed_machine_class_init_cpus_defaults(mc);
139
}
134
};
140
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_init(MachineState *machine)
135
141
136
static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
142
static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
137
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_ast2600_evb_class_init(ObjectClass *oc, void *data)
143
{
138
ASPEED_MAC3_ON;
144
- AspeedSoCState *soc = &bmc->soc;
139
amc->i2c_init = ast2600_evb_i2c_init;
145
+ AspeedSoCState *soc = bmc->soc;
140
mc->default_ram_size = 1 * GiB;
146
DeviceState *dev;
141
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
147
uint8_t *eeprom_buf = g_malloc0(32 * 1024);
142
- aspeed_soc_num_cpus(amc->soc_name);
148
143
+ aspeed_machine_class_init_cpus_defaults(mc);
149
@@ -XXX,XX +XXX,XX @@ static void palmetto_bmc_i2c_init(AspeedMachineState *bmc)
144
};
150
145
151
static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
146
static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
152
{
147
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_tacoma_class_init(ObjectClass *oc, void *data)
153
- AspeedSoCState *soc = &bmc->soc;
148
amc->macs_mask = ASPEED_MAC2_ON;
154
+ AspeedSoCState *soc = bmc->soc;
149
amc->i2c_init = witherspoon_bmc_i2c_init; /* Same board layout */
155
150
mc->default_ram_size = 1 * GiB;
156
/*
151
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
157
* The quanta-q71l platform expects tmp75s which are compatible with
152
- aspeed_soc_num_cpus(amc->soc_name);
158
@@ -XXX,XX +XXX,XX @@ static void quanta_q71l_bmc_i2c_init(AspeedMachineState *bmc)
153
+ aspeed_machine_class_init_cpus_defaults(mc);
159
154
};
160
static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
155
161
{
156
static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
162
- AspeedSoCState *soc = &bmc->soc;
157
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_g220a_class_init(ObjectClass *oc, void *data)
163
+ AspeedSoCState *soc = bmc->soc;
158
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
164
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
159
amc->i2c_init = g220a_bmc_i2c_init;
165
160
mc->default_ram_size = 1024 * MiB;
166
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 3), 0x50,
161
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
167
@@ -XXX,XX +XXX,XX @@ static void ast2500_evb_i2c_init(AspeedMachineState *bmc)
162
- aspeed_soc_num_cpus(amc->soc_name);
168
163
+ aspeed_machine_class_init_cpus_defaults(mc);
169
static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
164
};
170
{
165
171
- AspeedSoCState *soc = &bmc->soc;
166
static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
172
+ AspeedSoCState *soc = bmc->soc;
167
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fp5280g2_class_init(ObjectClass *oc, void *data)
173
uint8_t *eeprom_buf = g_malloc0(8 * 1024);
168
amc->macs_mask = ASPEED_MAC0_ON | ASPEED_MAC1_ON;
174
169
amc->i2c_init = fp5280g2_bmc_i2c_init;
175
smbus_eeprom_init_one(aspeed_i2c_get_bus(&soc->i2c, 7), 0x50,
170
mc->default_ram_size = 512 * MiB;
176
@@ -XXX,XX +XXX,XX @@ static void ast2600_evb_i2c_init(AspeedMachineState *bmc)
171
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
177
172
- aspeed_soc_num_cpus(amc->soc_name);
178
static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
173
+ aspeed_machine_class_init_cpus_defaults(mc);
179
{
174
};
180
- AspeedSoCState *soc = &bmc->soc;
175
181
+ AspeedSoCState *soc = bmc->soc;
176
static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
182
177
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_rainier_class_init(ObjectClass *oc, void *data)
183
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x51, 128 * KiB);
178
amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
184
at24c_eeprom_init_rom(aspeed_i2c_get_bus(&soc->i2c, 8), 0x51, 128 * KiB,
179
amc->i2c_init = rainier_bmc_i2c_init;
185
@@ -XXX,XX +XXX,XX @@ static void yosemitev2_bmc_i2c_init(AspeedMachineState *bmc)
180
mc->default_ram_size = 1 * GiB;
186
181
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
187
static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
182
- aspeed_soc_num_cpus(amc->soc_name);
188
{
183
+ aspeed_machine_class_init_cpus_defaults(mc);
189
- AspeedSoCState *soc = &bmc->soc;
184
};
190
+ AspeedSoCState *soc = bmc->soc;
185
191
186
#define FUJI_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
192
/* The romulus board expects Epson RX8900 I2C RTC but a ds1338 is
187
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fuji_class_init(ObjectClass *oc, void *data)
193
* good enough */
188
amc->i2c_init = fuji_bmc_i2c_init;
194
@@ -XXX,XX +XXX,XX @@ static void romulus_bmc_i2c_init(AspeedMachineState *bmc)
189
amc->uart_default = ASPEED_DEV_UART1;
195
190
mc->default_ram_size = FUJI_BMC_RAM_SIZE;
196
static void tiogapass_bmc_i2c_init(AspeedMachineState *bmc)
191
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
197
{
192
- aspeed_soc_num_cpus(amc->soc_name);
198
- AspeedSoCState *soc = &bmc->soc;
193
+ aspeed_machine_class_init_cpus_defaults(mc);
199
+ AspeedSoCState *soc = bmc->soc;
194
};
200
195
201
at24c_eeprom_init(aspeed_i2c_get_bus(&soc->i2c, 4), 0x54, 128 * KiB);
196
#define BLETCHLEY_BMC_RAM_SIZE ASPEED_RAM_SIZE(2 * GiB)
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)
197
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_bletchley_class_init(ObjectClass *oc, void *data)
198
amc->macs_mask = ASPEED_MAC2_ON;
199
amc->i2c_init = bletchley_bmc_i2c_init;
200
mc->default_ram_size = BLETCHLEY_BMC_RAM_SIZE;
201
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
202
- aspeed_soc_num_cpus(amc->soc_name);
203
+ aspeed_machine_class_init_cpus_defaults(mc);
204
}
205
293
static void fby35_reset(MachineState *state, ShutdownCause reason)
206
static void fby35_reset(MachineState *state, ShutdownCause reason)
294
{
207
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_fby35_class_init(ObjectClass *oc, void *data)
295
AspeedMachineState *bmc = ASPEED_MACHINE(state);
208
amc->i2c_init = fby35_i2c_init;
296
- AspeedGPIOState *gpio = &bmc->soc.gpio;
209
/* FIXME: Replace this macro with something more general */
297
+ AspeedGPIOState *gpio = &bmc->soc->gpio;
210
mc->default_ram_size = FUJI_BMC_RAM_SIZE;
298
211
+ aspeed_machine_class_init_cpus_defaults(mc);
299
qemu_devices_reset(reason);
212
}
300
213
301
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_init(MachineState *machine)
214
#define AST1030_INTERNAL_FLASH_SIZE (1024 * 1024)
302
sysclk = clock_new(OBJECT(machine), "SYSCLK");
215
@@ -XXX,XX +XXX,XX @@ static void aspeed_minibmc_machine_ast1030_evb_class_init(ObjectClass *oc,
303
clock_set_hz(sysclk, SYSCLK_FRQ);
216
amc->spi_model = "sst25vf032b";
304
217
amc->num_cs = 2;
305
- object_initialize_child(OBJECT(machine), "soc", &bmc->soc, amc->soc_name);
218
amc->macs_mask = 0;
306
- qdev_connect_clock_in(DEVICE(&bmc->soc), "sysclk", sysclk);
219
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
307
+ bmc->soc = ASPEED_SOC(object_new(amc->soc_name));
220
- aspeed_soc_num_cpus(amc->soc_name);
308
+ object_property_add_child(OBJECT(machine), "soc", OBJECT(bmc->soc));
221
+ aspeed_machine_class_init_cpus_defaults(mc);
309
+ object_unref(OBJECT(bmc->soc));
222
}
310
+ qdev_connect_clock_in(DEVICE(bmc->soc), "sysclk", sysclk);
223
311
224
static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
312
- object_property_set_link(OBJECT(&bmc->soc), "memory",
225
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_qcom_dc_scm_v1_class_init(ObjectClass *oc,
313
+ object_property_set_link(OBJECT(bmc->soc), "memory",
226
amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
314
OBJECT(get_system_memory()), &error_abort);
227
amc->i2c_init = qcom_dc_scm_bmc_i2c_init;
315
connect_serial_hds_to_uarts(bmc);
228
mc->default_ram_size = 1 * GiB;
316
- qdev_realize(DEVICE(&bmc->soc), NULL, &error_abort);
229
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
317
+ qdev_realize(DEVICE(bmc->soc), NULL, &error_abort);
230
- aspeed_soc_num_cpus(amc->soc_name);
318
231
+ aspeed_machine_class_init_cpus_defaults(mc);
319
- aspeed_board_init_flashes(&bmc->soc.fmc,
232
};
320
+ aspeed_board_init_flashes(&bmc->soc->fmc,
233
321
bmc->fmc_model ? bmc->fmc_model : amc->fmc_model,
234
static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
322
amc->num_cs,
235
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_qcom_firework_class_init(ObjectClass *oc,
323
0);
236
amc->macs_mask = ASPEED_MAC2_ON | ASPEED_MAC3_ON;
324
237
amc->i2c_init = qcom_dc_scm_firework_i2c_init;
325
- aspeed_board_init_flashes(&bmc->soc.spi[0],
238
mc->default_ram_size = 1 * GiB;
326
+ aspeed_board_init_flashes(&bmc->soc->spi[0],
239
- mc->default_cpus = mc->min_cpus = mc->max_cpus =
327
bmc->spi_model ? bmc->spi_model : amc->spi_model,
240
- aspeed_soc_num_cpus(amc->soc_name);
328
amc->num_cs, amc->num_cs);
241
+ aspeed_machine_class_init_cpus_defaults(mc);
329
242
};
330
- aspeed_board_init_flashes(&bmc->soc.spi[1],
243
331
+ aspeed_board_init_flashes(&bmc->soc->spi[1],
244
static const TypeInfo aspeed_machine_types[] = {
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);
344
--
245
--
345
2.41.0
246
2.43.0
346
247
347
248
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
The v7-A cluster is specific to the Aspeed 2600 series,
3
In order to alter AspeedSoCClass::cpu_type in the next
4
remove it from the common AspeedSoCState.
4
commit, introduce the aspeed_soc_cpu_type() helper to
5
5
retrieve the per-SoC CPU type from AspeedSoCClass.
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
6
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
10
Reviewed-by: Gavin Shan <gshan@redhat.com>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
11
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
12
---
14
include/hw/arm/aspeed_soc.h | 4 ++-
13
include/hw/arm/aspeed_soc.h | 1 +
15
hw/arm/aspeed_ast2600.c | 49 ++++++++++++++++++++-----------------
14
hw/arm/aspeed_ast10x0.c | 2 +-
16
hw/arm/fby35.c | 14 ++++++-----
15
hw/arm/aspeed_ast2400.c | 3 ++-
17
3 files changed, 37 insertions(+), 30 deletions(-)
16
hw/arm/aspeed_ast2600.c | 3 ++-
17
hw/arm/aspeed_soc_common.c | 5 +++++
18
5 files changed, 11 insertions(+), 3 deletions(-)
18
19
19
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
20
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
20
index XXXXXXX..XXXXXXX 100644
21
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/aspeed_soc.h
22
--- a/include/hw/arm/aspeed_soc.h
22
+++ b/include/hw/arm/aspeed_soc.h
23
+++ b/include/hw/arm/aspeed_soc.h
23
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
24
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCClass {
24
DeviceState parent;
25
qemu_irq (*get_irq)(AspeedSoCState *s, int dev);
25
26
ARMCPU cpu[ASPEED_CPUS_NUM];
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 */
38
};
26
};
39
27
40
#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
28
+const char *aspeed_soc_cpu_type(AspeedSoCClass *sc);
29
30
enum {
31
ASPEED_DEV_SPI_BOOT,
32
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
33
index XXXXXXX..XXXXXXX 100644
34
--- a/hw/arm/aspeed_ast10x0.c
35
+++ b/hw/arm/aspeed_ast10x0.c
36
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
37
/* AST1030 CPU Core */
38
armv7m = DEVICE(&a->armv7m);
39
qdev_prop_set_uint32(armv7m, "num-irq", 256);
40
- qdev_prop_set_string(armv7m, "cpu-type", sc->cpu_type);
41
+ qdev_prop_set_string(armv7m, "cpu-type", aspeed_soc_cpu_type(sc));
42
qdev_connect_clock_in(armv7m, "cpuclk", s->sysclk);
43
object_property_set_link(OBJECT(&a->armv7m), "memory",
44
OBJECT(s->memory), &error_abort);
45
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
46
index XXXXXXX..XXXXXXX 100644
47
--- a/hw/arm/aspeed_ast2400.c
48
+++ b/hw/arm/aspeed_ast2400.c
49
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_init(Object *obj)
50
}
51
52
for (i = 0; i < sc->num_cpus; i++) {
53
- object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
54
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i],
55
+ aspeed_soc_cpu_type(sc));
56
}
57
58
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
41
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
59
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
42
index XXXXXXX..XXXXXXX 100644
60
index XXXXXXX..XXXXXXX 100644
43
--- a/hw/arm/aspeed_ast2600.c
61
--- a/hw/arm/aspeed_ast2600.c
44
+++ b/hw/arm/aspeed_ast2600.c
62
+++ 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
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
63
}
64
}
64
65
65
for (i = 0; i < sc->num_cpus; i++) {
66
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);
67
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i], sc->cpu_type);
68
+ object_initialize_child(obj, "cpu[*]", &a->cpu[i],
69
+ aspeed_soc_cpu_type(sc));
68
}
70
}
69
71
70
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
72
snprintf(typename, sizeof(typename), "aspeed.scu-%s", socname);
71
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
73
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
72
object_property_add_alias(obj, "hw-prot-key", OBJECT(&s->scu),
74
index XXXXXXX..XXXXXXX 100644
73
"hw-prot-key");
75
--- a/hw/arm/aspeed_soc_common.c
74
76
+++ b/hw/arm/aspeed_soc_common.c
75
- object_initialize_child(obj, "a7mpcore", &s->a7mpcore,
77
@@ -XXX,XX +XXX,XX @@
76
+ object_initialize_child(obj, "a7mpcore", &a->a7mpcore,
78
#include "hw/char/serial.h"
77
TYPE_A15MPCORE_PRIV);
79
78
80
79
object_initialize_child(obj, "rtc", &s->rtc, TYPE_ASPEED_RTC);
81
+const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
80
@@ -XXX,XX +XXX,XX @@ static uint64_t aspeed_calc_affinity(int cpu)
82
+{
81
static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
83
+ return sc->cpu_type;
84
+}
85
+
86
qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
82
{
87
{
83
int i;
88
return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
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,
243
--
89
--
244
2.41.0
90
2.43.0
245
91
246
92
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
2
2
3
TYPE_ASPEED2400_SOC inherits from TYPE_ASPEED_SOC.
3
Aspeed SoCs use a single CPU type (set as AspeedSoCClass::cpu_type).
4
In few commits we'll add more fields, but to keep
4
Convert it to a NULL-terminated array (of a single non-NULL element).
5
review process simple, don't add any yet.
6
5
7
TYPE_ASPEED_SOC is common to various Aspeed SoCs,
6
Set MachineClass::valid_cpu_types[] to use the common machine code
8
define it in aspeed_soc_common.c.
7
to provide hints when the requested CPU is invalid (see commit
8
e702cbc19e ("machine: Improve is_cpu_type_supported()").
9
9
10
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
12
Reviewed-by: Gavin Shan <gshan@redhat.com>
10
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
13
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
13
---
15
---
14
include/hw/arm/aspeed_soc.h | 7 +++++
16
include/hw/arm/aspeed_soc.h | 3 ++-
15
hw/arm/aspeed_soc.c | 61 +++++++++++--------------------------
17
hw/arm/aspeed.c | 1 +
16
hw/arm/aspeed_soc_common.c | 29 ++++++++++++++++++
18
hw/arm/aspeed_ast10x0.c | 6 +++++-
17
3 files changed, 53 insertions(+), 44 deletions(-)
19
hw/arm/aspeed_ast2400.c | 12 ++++++++++--
20
hw/arm/aspeed_ast2600.c | 6 +++++-
21
hw/arm/aspeed_soc_common.c | 5 ++++-
22
6 files changed, 27 insertions(+), 6 deletions(-)
18
23
19
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
24
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
20
index XXXXXXX..XXXXXXX 100644
25
index XXXXXXX..XXXXXXX 100644
21
--- a/include/hw/arm/aspeed_soc.h
26
--- a/include/hw/arm/aspeed_soc.h
22
+++ b/include/hw/arm/aspeed_soc.h
27
+++ b/include/hw/arm/aspeed_soc.h
23
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
28
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCClass {
24
#define TYPE_ASPEED_SOC "aspeed-soc"
29
DeviceClass parent_class;
25
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
30
26
31
const char *name;
27
+struct Aspeed2400SoCState {
32
- const char *cpu_type;
28
+ AspeedSoCState parent;
33
+ /** valid_cpu_types: NULL terminated array of a single CPU type. */
29
+};
34
+ const char * const *valid_cpu_types;
30
+
35
uint32_t silicon_rev;
31
+#define TYPE_ASPEED2400_SOC "aspeed2400-soc"
36
uint64_t sram_size;
32
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2400SoCState, ASPEED2400_SOC)
37
uint64_t secsram_size;
33
+
38
diff --git a/hw/arm/aspeed.c b/hw/arm/aspeed.c
34
struct Aspeed2600SoCState {
35
AspeedSoCState parent;
36
};
37
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
38
index XXXXXXX..XXXXXXX 100644
39
index XXXXXXX..XXXXXXX 100644
39
--- a/hw/arm/aspeed_soc.c
40
--- a/hw/arm/aspeed.c
40
+++ b/hw/arm/aspeed_soc.c
41
+++ b/hw/arm/aspeed.c
42
@@ -XXX,XX +XXX,XX @@ static void aspeed_machine_class_init_cpus_defaults(MachineClass *mc)
43
mc->default_cpus = sc->num_cpus;
44
mc->min_cpus = sc->num_cpus;
45
mc->max_cpus = sc->num_cpus;
46
+ mc->valid_cpu_types = sc->valid_cpu_types;
47
}
48
49
static void aspeed_machine_class_init(ObjectClass *oc, void *data)
50
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
51
index XXXXXXX..XXXXXXX 100644
52
--- a/hw/arm/aspeed_ast10x0.c
53
+++ b/hw/arm/aspeed_ast10x0.c
54
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_realize(DeviceState *dev_soc, Error **errp)
55
56
static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
57
{
58
+ static const char * const valid_cpu_types[] = {
59
+ ARM_CPU_TYPE_NAME("cortex-m4"), /* TODO cortex-m4f */
60
+ NULL
61
+ };
62
DeviceClass *dc = DEVICE_CLASS(klass);
63
AspeedSoCClass *sc = ASPEED_SOC_CLASS(dc);
64
65
dc->realize = aspeed_soc_ast1030_realize;
66
67
sc->name = "ast1030-a1";
68
- sc->cpu_type = ARM_CPU_TYPE_NAME("cortex-m4"); /* TODO cortex-m4f */
69
+ sc->valid_cpu_types = valid_cpu_types;
70
sc->silicon_rev = AST1030_A1_SILICON_REV;
71
sc->sram_size = 0xc0000;
72
sc->secsram_size = 0x40000; /* 256 * KiB */
73
diff --git a/hw/arm/aspeed_ast2400.c b/hw/arm/aspeed_ast2400.c
74
index XXXXXXX..XXXXXXX 100644
75
--- a/hw/arm/aspeed_ast2400.c
76
+++ b/hw/arm/aspeed_ast2400.c
41
@@ -XXX,XX +XXX,XX @@ static void aspeed_ast2400_soc_realize(DeviceState *dev, Error **errp)
77
@@ -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)
54
-{
55
- DeviceClass *dc = DEVICE_CLASS(oc);
56
-
57
- device_class_set_props(dc, aspeed_soc_properties);
58
-}
59
-
60
-static const TypeInfo aspeed_soc_type_info = {
61
- .name = TYPE_ASPEED_SOC,
62
- .parent = TYPE_DEVICE,
63
- .instance_size = sizeof(AspeedSoCState),
64
- .class_size = sizeof(AspeedSoCClass),
65
- .class_init = aspeed_soc_class_init,
66
- .abstract = true,
67
-};
68
78
69
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
79
static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
70
{
80
{
81
+ static const char * const valid_cpu_types[] = {
82
+ ARM_CPU_TYPE_NAME("arm926"),
83
+ NULL
84
+ };
85
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
86
DeviceClass *dc = DEVICE_CLASS(oc);
87
71
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
88
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
72
sc->get_irq = aspeed_soc_ast2400_get_irq;
89
dc->user_creatable = false;
73
}
90
74
91
sc->name = "ast2400-a1";
75
-static const TypeInfo aspeed_soc_ast2400_type_info = {
92
- sc->cpu_type = ARM_CPU_TYPE_NAME("arm926");
76
- .name = "ast2400-a1",
93
+ sc->valid_cpu_types = valid_cpu_types;
77
- .parent = TYPE_ASPEED_SOC,
94
sc->silicon_rev = AST2400_A1_SILICON_REV;
78
- .instance_init = aspeed_ast2400_soc_init,
95
sc->sram_size = 0x8000;
79
- .instance_size = sizeof(AspeedSoCState),
96
sc->spis_num = 1;
80
- .class_init = aspeed_soc_ast2400_class_init,
97
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
81
-};
98
82
-
83
static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
99
static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
84
{
100
{
101
+ static const char * const valid_cpu_types[] = {
102
+ ARM_CPU_TYPE_NAME("arm1176"),
103
+ NULL
104
+ };
85
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
105
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
106
DeviceClass *dc = DEVICE_CLASS(oc);
107
86
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
108
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2500_class_init(ObjectClass *oc, void *data)
87
sc->get_irq = aspeed_soc_ast2400_get_irq;
109
dc->user_creatable = false;
88
}
110
89
111
sc->name = "ast2500-a1";
90
-static const TypeInfo aspeed_soc_ast2500_type_info = {
112
- sc->cpu_type = ARM_CPU_TYPE_NAME("arm1176");
91
- .name = "ast2500-a1",
113
+ sc->valid_cpu_types = valid_cpu_types;
92
- .parent = TYPE_ASPEED_SOC,
114
sc->silicon_rev = AST2500_A1_SILICON_REV;
93
- .instance_init = aspeed_ast2400_soc_init,
115
sc->sram_size = 0x9000;
94
- .instance_size = sizeof(AspeedSoCState),
116
sc->spis_num = 2;
95
- .class_init = aspeed_soc_ast2500_class_init,
117
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
96
-};
118
index XXXXXXX..XXXXXXX 100644
97
-static void aspeed_soc_register_types(void)
119
--- a/hw/arm/aspeed_ast2600.c
98
-{
120
+++ b/hw/arm/aspeed_ast2600.c
99
- type_register_static(&aspeed_soc_type_info);
121
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
100
- type_register_static(&aspeed_soc_ast2400_type_info);
122
101
- type_register_static(&aspeed_soc_ast2500_type_info);
123
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
102
+static const TypeInfo aspeed_soc_ast2400_types[] = {
124
{
103
+ {
125
+ static const char * const valid_cpu_types[] = {
104
+ .name = TYPE_ASPEED2400_SOC,
126
+ ARM_CPU_TYPE_NAME("cortex-a7"),
105
+ .parent = TYPE_ASPEED_SOC,
127
+ NULL
106
+ .instance_init = aspeed_ast2400_soc_init,
128
+ };
107
+ .instance_size = sizeof(Aspeed2400SoCState),
129
DeviceClass *dc = DEVICE_CLASS(oc);
108
+ .abstract = true,
130
AspeedSoCClass *sc = ASPEED_SOC_CLASS(oc);
109
+ }, {
131
110
+ .name = "ast2400-a1",
132
dc->realize = aspeed_soc_ast2600_realize;
111
+ .parent = TYPE_ASPEED2400_SOC,
133
112
+ .class_init = aspeed_soc_ast2400_class_init,
134
sc->name = "ast2600-a3";
113
+ }, {
135
- sc->cpu_type = ARM_CPU_TYPE_NAME("cortex-a7");
114
+ .name = "ast2500-a1",
136
+ sc->valid_cpu_types = valid_cpu_types;
115
+ .parent = TYPE_ASPEED2400_SOC,
137
sc->silicon_rev = AST2600_A3_SILICON_REV;
116
+ .class_init = aspeed_soc_ast2500_class_init,
138
sc->sram_size = 0x16400;
117
+ },
139
sc->spis_num = 2;
118
};
119
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
140
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
123
index XXXXXXX..XXXXXXX 100644
141
index XXXXXXX..XXXXXXX 100644
124
--- a/hw/arm/aspeed_soc_common.c
142
--- a/hw/arm/aspeed_soc_common.c
125
+++ b/hw/arm/aspeed_soc_common.c
143
+++ b/hw/arm/aspeed_soc_common.c
126
@@ -XXX,XX +XXX,XX @@
144
@@ -XXX,XX +XXX,XX @@
127
145
128
#include "qemu/osdep.h"
146
const char *aspeed_soc_cpu_type(AspeedSoCClass *sc)
129
#include "qapi/error.h"
147
{
130
+#include "hw/qdev-properties.h"
148
- return sc->cpu_type;
131
#include "hw/misc/unimp.h"
149
+ assert(sc->valid_cpu_types);
132
#include "hw/arm/aspeed_soc.h"
150
+ assert(sc->valid_cpu_types[0]);
133
#include "hw/char/serial.h"
151
+ assert(!sc->valid_cpu_types[1]);
134
@@ -XXX,XX +XXX,XX @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
152
+ return sc->valid_cpu_types[0];
135
memory_region_add_subregion_overlap(s->memory, addr,
136
sysbus_mmio_get_region(dev, 0), -1000);
137
}
153
}
138
+
154
139
+static Property aspeed_soc_properties[] = {
155
qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
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)
148
+{
149
+ DeviceClass *dc = DEVICE_CLASS(oc);
150
+
151
+ device_class_set_props(dc, aspeed_soc_properties);
152
+}
153
+
154
+static const TypeInfo aspeed_soc_types[] = {
155
+ {
156
+ .name = TYPE_ASPEED_SOC,
157
+ .parent = TYPE_DEVICE,
158
+ .instance_size = sizeof(AspeedSoCState),
159
+ .class_size = sizeof(AspeedSoCClass),
160
+ .class_init = aspeed_soc_class_init,
161
+ .abstract = true,
162
+ },
163
+};
164
+
165
+DEFINE_TYPES(aspeed_soc_types)
166
--
156
--
167
2.41.0
157
2.43.0
168
158
169
159
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
aspeed_soc.c contains definitions specific to the AST2400
3
This is a part of patchset where IBM's Flexible Service Interface is
4
and AST2500 SoCs, but also some definitions for other AST
4
introduced.
5
SoCs: move them to a common file.
6
5
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
6
The LBUS is modelled to maintain mapped memory for the devices. The
7
memory is mapped after CFAM config, peek table and FSI slave registers.
8
9
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
10
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
11
Reviewed-by: Cédric Le Goater <clg@kaod.org>
12
[ clg: - removed lbus_add_device() bc unused
13
- removed lbus_create_device() bc used only once
14
- removed "address" property
15
- updated meson.build to build fsi dir
16
- included an empty hw/fsi/trace-events ]
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
17
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
18
---
11
hw/arm/aspeed_soc.c | 96 -------------------------------
19
meson.build | 1 +
12
hw/arm/aspeed_soc_common.c | 114 +++++++++++++++++++++++++++++++++++++
20
hw/fsi/trace.h | 1 +
13
hw/arm/meson.build | 1 +
21
include/hw/fsi/lbus.h | 32 ++++++++++++++++++++++++++++++++
14
3 files changed, 115 insertions(+), 96 deletions(-)
22
hw/fsi/lbus.c | 43 +++++++++++++++++++++++++++++++++++++++++++
15
create mode 100644 hw/arm/aspeed_soc_common.c
23
hw/Kconfig | 1 +
24
hw/fsi/Kconfig | 2 ++
25
hw/fsi/meson.build | 1 +
26
hw/fsi/trace-events | 0
27
hw/meson.build | 1 +
28
9 files changed, 82 insertions(+)
29
create mode 100644 hw/fsi/trace.h
30
create mode 100644 include/hw/fsi/lbus.h
31
create mode 100644 hw/fsi/lbus.c
32
create mode 100644 hw/fsi/Kconfig
33
create mode 100644 hw/fsi/meson.build
34
create mode 100644 hw/fsi/trace-events
16
35
17
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
36
diff --git a/meson.build b/meson.build
18
index XXXXXXX..XXXXXXX 100644
37
index XXXXXXX..XXXXXXX 100644
19
--- a/hw/arm/aspeed_soc.c
38
--- a/meson.build
20
+++ b/hw/arm/aspeed_soc.c
39
+++ b/meson.build
21
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_register_types(void)
40
@@ -XXX,XX +XXX,XX @@ if have_system
22
};
41
'hw/char',
23
42
'hw/display',
24
type_init(aspeed_soc_register_types);
43
'hw/dma',
25
-
44
+ 'hw/fsi',
26
-qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
45
'hw/hyperv',
27
-{
46
'hw/i2c',
28
- return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
47
'hw/i386',
29
-}
48
diff --git a/hw/fsi/trace.h b/hw/fsi/trace.h
30
-
31
-bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
32
-{
33
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
34
- SerialMM *smm;
35
-
36
- for (int i = 0, uart = ASPEED_DEV_UART1; i < sc->uarts_num; i++, uart++) {
37
- smm = &s->uart[i];
38
-
39
- /* Chardev property is set by the machine. */
40
- qdev_prop_set_uint8(DEVICE(smm), "regshift", 2);
41
- qdev_prop_set_uint32(DEVICE(smm), "baudbase", 38400);
42
- qdev_set_legacy_instance_id(DEVICE(smm), sc->memmap[uart], 2);
43
- qdev_prop_set_uint8(DEVICE(smm), "endianness", DEVICE_LITTLE_ENDIAN);
44
- if (!sysbus_realize(SYS_BUS_DEVICE(smm), errp)) {
45
- return false;
46
- }
47
-
48
- sysbus_connect_irq(SYS_BUS_DEVICE(smm), 0, aspeed_soc_get_irq(s, uart));
49
- aspeed_mmio_map(s, SYS_BUS_DEVICE(smm), 0, sc->memmap[uart]);
50
- }
51
-
52
- return true;
53
-}
54
-
55
-void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr)
56
-{
57
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
58
- int i = dev - ASPEED_DEV_UART1;
59
-
60
- g_assert(0 <= i && i < ARRAY_SIZE(s->uart) && i < sc->uarts_num);
61
- qdev_prop_set_chr(DEVICE(&s->uart[i]), "chardev", chr);
62
-}
63
-
64
-/*
65
- * SDMC should be realized first to get correct RAM size and max size
66
- * values
67
- */
68
-bool aspeed_soc_dram_init(AspeedSoCState *s, Error **errp)
69
-{
70
- AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
71
- ram_addr_t ram_size, max_ram_size;
72
-
73
- ram_size = object_property_get_uint(OBJECT(&s->sdmc), "ram-size",
74
- &error_abort);
75
- max_ram_size = object_property_get_uint(OBJECT(&s->sdmc), "max-ram-size",
76
- &error_abort);
77
-
78
- memory_region_init(&s->dram_container, OBJECT(s), "ram-container",
79
- max_ram_size);
80
- memory_region_add_subregion(&s->dram_container, 0, s->dram_mr);
81
-
82
- /*
83
- * Add a memory region beyond the RAM region to let firmwares scan
84
- * the address space with load/store and guess how much RAM the
85
- * SoC has.
86
- */
87
- if (ram_size < max_ram_size) {
88
- DeviceState *dev = qdev_new(TYPE_UNIMPLEMENTED_DEVICE);
89
-
90
- qdev_prop_set_string(dev, "name", "ram-empty");
91
- qdev_prop_set_uint64(dev, "size", max_ram_size - ram_size);
92
- if (!sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), errp)) {
93
- return false;
94
- }
95
-
96
- memory_region_add_subregion_overlap(&s->dram_container, ram_size,
97
- sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0), -1000);
98
- }
99
-
100
- memory_region_add_subregion(s->memory,
101
- sc->memmap[ASPEED_DEV_SDRAM], &s->dram_container);
102
- return true;
103
-}
104
-
105
-void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr)
106
-{
107
- memory_region_add_subregion(s->memory, addr,
108
- sysbus_mmio_get_region(dev, n));
109
-}
110
-
111
-void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
112
- const char *name, hwaddr addr, uint64_t size)
113
-{
114
- qdev_prop_set_string(DEVICE(dev), "name", name);
115
- qdev_prop_set_uint64(DEVICE(dev), "size", size);
116
- sysbus_realize(dev, &error_abort);
117
-
118
- memory_region_add_subregion_overlap(s->memory, addr,
119
- sysbus_mmio_get_region(dev, 0), -1000);
120
-}
121
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
122
new file mode 100644
49
new file mode 100644
123
index XXXXXXX..XXXXXXX
50
index XXXXXXX..XXXXXXX
124
--- /dev/null
51
--- /dev/null
125
+++ b/hw/arm/aspeed_soc_common.c
52
+++ b/hw/fsi/trace.h
53
@@ -0,0 +1 @@
54
+#include "trace/trace-hw_fsi.h"
55
diff --git a/include/hw/fsi/lbus.h b/include/hw/fsi/lbus.h
56
new file mode 100644
57
index XXXXXXX..XXXXXXX
58
--- /dev/null
59
+++ b/include/hw/fsi/lbus.h
126
@@ -XXX,XX +XXX,XX @@
60
@@ -XXX,XX +XXX,XX @@
127
+/*
61
+/*
128
+ * ASPEED SoC family
62
+ * SPDX-License-Identifier: GPL-2.0-or-later
63
+ * Copyright (C) 2024 IBM Corp.
129
+ *
64
+ *
130
+ * Andrew Jeffery <andrew@aj.id.au>
65
+ * IBM Local bus and connected device structures.
131
+ * Jeremy Kerr <jk@ozlabs.org>
66
+ */
67
+#ifndef FSI_LBUS_H
68
+#define FSI_LBUS_H
69
+
70
+#include "hw/qdev-core.h"
71
+#include "qemu/units.h"
72
+#include "exec/memory.h"
73
+
74
+#define TYPE_FSI_LBUS_DEVICE "fsi.lbus.device"
75
+OBJECT_DECLARE_SIMPLE_TYPE(FSILBusDevice, FSI_LBUS_DEVICE)
76
+
77
+typedef struct FSILBusDevice {
78
+ DeviceState parent;
79
+
80
+ MemoryRegion iomem;
81
+} FSILBusDevice;
82
+
83
+#define TYPE_FSI_LBUS "fsi.lbus"
84
+OBJECT_DECLARE_SIMPLE_TYPE(FSILBus, FSI_LBUS)
85
+
86
+typedef struct FSILBus {
87
+ BusState bus;
88
+
89
+ MemoryRegion mr;
90
+} FSILBus;
91
+
92
+#endif /* FSI_LBUS_H */
93
diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c
94
new file mode 100644
95
index XXXXXXX..XXXXXXX
96
--- /dev/null
97
+++ b/hw/fsi/lbus.c
98
@@ -XXX,XX +XXX,XX @@
99
+/*
100
+ * SPDX-License-Identifier: GPL-2.0-or-later
101
+ * Copyright (C) 2024 IBM Corp.
132
+ *
102
+ *
133
+ * Copyright 2016 IBM Corp.
103
+ * IBM Local bus where FSI slaves are connected
134
+ *
135
+ * This code is licensed under the GPL version 2 or later. See
136
+ * the COPYING file in the top-level directory.
137
+ */
104
+ */
138
+
105
+
139
+#include "qemu/osdep.h"
106
+#include "qemu/osdep.h"
140
+#include "qapi/error.h"
107
+#include "qapi/error.h"
141
+#include "hw/misc/unimp.h"
108
+#include "hw/fsi/lbus.h"
142
+#include "hw/arm/aspeed_soc.h"
143
+#include "hw/char/serial.h"
144
+
109
+
110
+#include "hw/qdev-properties.h"
145
+
111
+
146
+qemu_irq aspeed_soc_get_irq(AspeedSoCState *s, int dev)
112
+#include "trace.h"
113
+
114
+static void fsi_lbus_init(Object *o)
147
+{
115
+{
148
+ return ASPEED_SOC_GET_CLASS(s)->get_irq(s, dev);
116
+ FSILBus *lbus = FSI_LBUS(o);
117
+
118
+ memory_region_init(&lbus->mr, OBJECT(lbus), TYPE_FSI_LBUS, 1 * MiB);
149
+}
119
+}
150
+
120
+
151
+bool aspeed_soc_uart_realize(AspeedSoCState *s, Error **errp)
121
+static const TypeInfo fsi_lbus_info = {
122
+ .name = TYPE_FSI_LBUS,
123
+ .parent = TYPE_BUS,
124
+ .instance_init = fsi_lbus_init,
125
+ .instance_size = sizeof(FSILBus),
126
+};
127
+
128
+static const TypeInfo fsi_lbus_device_type_info = {
129
+ .name = TYPE_FSI_LBUS_DEVICE,
130
+ .parent = TYPE_DEVICE,
131
+ .instance_size = sizeof(FSILBusDevice),
132
+ .abstract = true,
133
+};
134
+
135
+static void fsi_lbus_register_types(void)
152
+{
136
+{
153
+ AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
137
+ type_register_static(&fsi_lbus_info);
154
+ SerialMM *smm;
138
+ type_register_static(&fsi_lbus_device_type_info);
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]);
170
+ }
171
+
172
+ return true;
173
+}
139
+}
174
+
140
+
175
+void aspeed_soc_uart_set_chr(AspeedSoCState *s, int dev, Chardev *chr)
141
+type_init(fsi_lbus_register_types);
176
+{
142
diff --git a/hw/Kconfig b/hw/Kconfig
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);
218
+ }
219
+
220
+ memory_region_add_subregion(s->memory,
221
+ sc->memmap[ASPEED_DEV_SDRAM], &s->dram_container);
222
+ return true;
223
+}
224
+
225
+void aspeed_mmio_map(AspeedSoCState *s, SysBusDevice *dev, int n, hwaddr addr)
226
+{
227
+ memory_region_add_subregion(s->memory, addr,
228
+ sysbus_mmio_get_region(dev, n));
229
+}
230
+
231
+void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
232
+ const char *name, hwaddr addr, uint64_t size)
233
+{
234
+ qdev_prop_set_string(DEVICE(dev), "name", name);
235
+ qdev_prop_set_uint64(DEVICE(dev), "size", size);
236
+ sysbus_realize(dev, &error_abort);
237
+
238
+ memory_region_add_subregion_overlap(s->memory, addr,
239
+ sysbus_mmio_get_region(dev, 0), -1000);
240
+}
241
diff --git a/hw/arm/meson.build b/hw/arm/meson.build
242
index XXXXXXX..XXXXXXX 100644
143
index XXXXXXX..XXXXXXX 100644
243
--- a/hw/arm/meson.build
144
--- a/hw/Kconfig
244
+++ b/hw/arm/meson.build
145
+++ b/hw/Kconfig
245
@@ -XXX,XX +XXX,XX @@ arm_ss.add(when: 'CONFIG_FSL_IMX6', if_true: files('fsl-imx6.c'))
146
@@ -XXX,XX +XXX,XX @@ source core/Kconfig
246
arm_ss.add(when: 'CONFIG_ASPEED_SOC', if_true: files(
147
source cxl/Kconfig
247
'aspeed_soc.c',
148
source display/Kconfig
248
'aspeed.c',
149
source dma/Kconfig
249
+ 'aspeed_soc_common.c',
150
+source fsi/Kconfig
250
'aspeed_ast2600.c',
151
source gpio/Kconfig
251
'aspeed_ast10x0.c',
152
source hyperv/Kconfig
252
'aspeed_eeprom.c',
153
source i2c/Kconfig
154
diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig
155
new file mode 100644
156
index XXXXXXX..XXXXXXX
157
--- /dev/null
158
+++ b/hw/fsi/Kconfig
159
@@ -XXX,XX +XXX,XX @@
160
+config FSI
161
+ bool
162
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
163
new file mode 100644
164
index XXXXXXX..XXXXXXX
165
--- /dev/null
166
+++ b/hw/fsi/meson.build
167
@@ -0,0 +1 @@
168
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c'))
169
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
170
new file mode 100644
171
index XXXXXXX..XXXXXXX
172
diff --git a/hw/meson.build b/hw/meson.build
173
index XXXXXXX..XXXXXXX 100644
174
--- a/hw/meson.build
175
+++ b/hw/meson.build
176
@@ -XXX,XX +XXX,XX @@ subdir('virtio')
177
subdir('watchdog')
178
subdir('xen')
179
subdir('xenpv')
180
+subdir('fsi')
181
182
subdir('alpha')
183
subdir('arm')
253
--
184
--
254
2.41.0
185
2.43.0
255
186
256
187
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
This is a part of patchset where IBM's Flexible Service Interface is
4
introduced.
5
6
The scratchpad provides a set of non-functional registers. The firmware
7
is free to use them, hardware does not support any special management
8
support. The scratchpad registers can be read or written from LBUS
9
slave. The scratch pad is managed under FSI CFAM state.
10
11
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
12
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
14
[ clg: - moved object FSIScratchPad under FSICFAMState
15
- moved FSIScratchPad code under cfam.c ]
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
16
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
17
---
7
hw/arm/aspeed_soc.c | 6 +++---
18
include/hw/fsi/lbus.h | 11 ++++++
8
1 file changed, 3 insertions(+), 3 deletions(-)
19
hw/fsi/lbus.c | 78 +++++++++++++++++++++++++++++++++++++++++--
20
hw/fsi/trace-events | 2 ++
21
3 files changed, 89 insertions(+), 2 deletions(-)
9
22
10
diff --git a/hw/arm/aspeed_soc.c b/hw/arm/aspeed_soc.c
23
diff --git a/include/hw/fsi/lbus.h b/include/hw/fsi/lbus.h
11
index XXXXXXX..XXXXXXX 100644
24
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/aspeed_soc.c
25
--- a/include/hw/fsi/lbus.h
13
+++ b/hw/arm/aspeed_soc.c
26
+++ b/include/hw/fsi/lbus.h
14
@@ -XXX,XX +XXX,XX @@ static qemu_irq aspeed_soc_ast2400_get_irq(AspeedSoCState *s, int dev)
27
@@ -XXX,XX +XXX,XX @@ typedef struct FSILBus {
15
return qdev_get_gpio_in(DEVICE(&s->vic), sc->irqmap[dev]);
28
MemoryRegion mr;
29
} FSILBus;
30
31
+#define TYPE_FSI_SCRATCHPAD "fsi.scratchpad"
32
+#define SCRATCHPAD(obj) OBJECT_CHECK(FSIScratchPad, (obj), TYPE_FSI_SCRATCHPAD)
33
+
34
+#define FSI_SCRATCHPAD_NR_REGS 4
35
+
36
+typedef struct FSIScratchPad {
37
+ FSILBusDevice parent;
38
+
39
+ uint32_t regs[FSI_SCRATCHPAD_NR_REGS];
40
+} FSIScratchPad;
41
+
42
#endif /* FSI_LBUS_H */
43
diff --git a/hw/fsi/lbus.c b/hw/fsi/lbus.c
44
index XXXXXXX..XXXXXXX 100644
45
--- a/hw/fsi/lbus.c
46
+++ b/hw/fsi/lbus.c
47
@@ -XXX,XX +XXX,XX @@
48
#include "qemu/osdep.h"
49
#include "qapi/error.h"
50
#include "hw/fsi/lbus.h"
51
-
52
#include "hw/qdev-properties.h"
53
-
54
+#include "qemu/log.h"
55
#include "trace.h"
56
57
+#define TO_REG(offset) ((offset) >> 2)
58
+
59
static void fsi_lbus_init(Object *o)
60
{
61
FSILBus *lbus = FSI_LBUS(o);
62
@@ -XXX,XX +XXX,XX @@ static const TypeInfo fsi_lbus_device_type_info = {
63
.abstract = true,
64
};
65
66
+static uint64_t fsi_scratchpad_read(void *opaque, hwaddr addr, unsigned size)
67
+{
68
+ FSIScratchPad *s = SCRATCHPAD(opaque);
69
+ int reg = TO_REG(addr);
70
+
71
+ trace_fsi_scratchpad_read(addr, size);
72
+
73
+ if (reg >= FSI_SCRATCHPAD_NR_REGS) {
74
+ qemu_log_mask(LOG_GUEST_ERROR,
75
+ "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
76
+ __func__, addr);
77
+ return 0;
78
+ }
79
+
80
+ return s->regs[reg];
81
+}
82
+
83
+static void fsi_scratchpad_write(void *opaque, hwaddr addr, uint64_t data,
84
+ unsigned size)
85
+{
86
+ FSIScratchPad *s = SCRATCHPAD(opaque);
87
+
88
+ trace_fsi_scratchpad_write(addr, size, data);
89
+ int reg = TO_REG(addr);
90
+
91
+ if (reg >= FSI_SCRATCHPAD_NR_REGS) {
92
+ qemu_log_mask(LOG_GUEST_ERROR,
93
+ "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
94
+ __func__, addr);
95
+ return;
96
+ }
97
+
98
+ s->regs[reg] = data;
99
+}
100
+
101
+static const struct MemoryRegionOps scratchpad_ops = {
102
+ .read = fsi_scratchpad_read,
103
+ .write = fsi_scratchpad_write,
104
+ .endianness = DEVICE_BIG_ENDIAN,
105
+};
106
+
107
+static void fsi_scratchpad_realize(DeviceState *dev, Error **errp)
108
+{
109
+ FSILBusDevice *ldev = FSI_LBUS_DEVICE(dev);
110
+
111
+ memory_region_init_io(&ldev->iomem, OBJECT(ldev), &scratchpad_ops,
112
+ ldev, TYPE_FSI_SCRATCHPAD, 0x400);
113
+}
114
+
115
+static void fsi_scratchpad_reset(DeviceState *dev)
116
+{
117
+ FSIScratchPad *s = SCRATCHPAD(dev);
118
+
119
+ memset(s->regs, 0, sizeof(s->regs));
120
+}
121
+
122
+static void fsi_scratchpad_class_init(ObjectClass *klass, void *data)
123
+{
124
+ DeviceClass *dc = DEVICE_CLASS(klass);
125
+
126
+ dc->bus_type = TYPE_FSI_LBUS;
127
+ dc->realize = fsi_scratchpad_realize;
128
+ dc->reset = fsi_scratchpad_reset;
129
+}
130
+
131
+static const TypeInfo fsi_scratchpad_info = {
132
+ .name = TYPE_FSI_SCRATCHPAD,
133
+ .parent = TYPE_FSI_LBUS_DEVICE,
134
+ .instance_size = sizeof(FSIScratchPad),
135
+ .class_init = fsi_scratchpad_class_init,
136
+};
137
+
138
static void fsi_lbus_register_types(void)
139
{
140
type_register_static(&fsi_lbus_info);
141
type_register_static(&fsi_lbus_device_type_info);
142
+ type_register_static(&fsi_scratchpad_info);
16
}
143
}
17
144
18
-static void aspeed_soc_init(Object *obj)
145
type_init(fsi_lbus_register_types);
19
+static void aspeed_ast2400_soc_init(Object *obj)
146
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
20
{
147
index XXXXXXX..XXXXXXX 100644
21
AspeedSoCState *s = ASPEED_SOC(obj);
148
--- a/hw/fsi/trace-events
22
AspeedSoCClass *sc = ASPEED_SOC_GET_CLASS(s);
149
+++ b/hw/fsi/trace-events
23
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2400_class_init(ObjectClass *oc, void *data)
150
@@ -XXX,XX +XXX,XX @@
24
static const TypeInfo aspeed_soc_ast2400_type_info = {
151
+fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
25
.name = "ast2400-a1",
152
+fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
26
.parent = TYPE_ASPEED_SOC,
27
- .instance_init = aspeed_soc_init,
28
+ .instance_init = aspeed_ast2400_soc_init,
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
};
41
--
153
--
42
2.41.0
154
2.43.0
43
155
44
156
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
TYPE_ASPEED10X0_SOC inherits from TYPE_ASPEED_SOC.
3
This is a part of patchset where FSI bus is introduced.
4
In few commits we'll add more fields, but to keep
5
review process simple, don't add any yet.
6
4
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
The FSI bus is a simple bus where FSI master is attached.
6
7
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
8
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Reviewed-by: Cédric Le Goater <clg@kaod.org>
10
[ clg: - removed include/hw/fsi/engine-scratchpad.h and
11
     hw/fsi/engine-scratchpad.c
12
- dropped FSI_SCRATCHPAD
13
- included FSIBus definition
14
- dropped hw/fsi/trace-events changes ]
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
15
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
16
---
11
include/hw/arm/aspeed_soc.h | 7 +++++++
17
include/hw/fsi/fsi.h | 19 +++++++++++++++++++
12
hw/arm/aspeed_ast10x0.c | 26 +++++++++++++-------------
18
hw/fsi/fsi.c | 22 ++++++++++++++++++++++
13
2 files changed, 20 insertions(+), 13 deletions(-)
19
hw/fsi/meson.build | 2 +-
20
3 files changed, 42 insertions(+), 1 deletion(-)
21
create mode 100644 include/hw/fsi/fsi.h
22
create mode 100644 hw/fsi/fsi.c
14
23
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
24
diff --git a/include/hw/fsi/fsi.h b/include/hw/fsi/fsi.h
16
index XXXXXXX..XXXXXXX 100644
25
new file mode 100644
17
--- a/include/hw/arm/aspeed_soc.h
26
index XXXXXXX..XXXXXXX
18
+++ b/include/hw/arm/aspeed_soc.h
27
--- /dev/null
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
28
+++ b/include/hw/fsi/fsi.h
20
#define TYPE_ASPEED_SOC "aspeed-soc"
29
@@ -XXX,XX +XXX,XX @@
21
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
30
+/*
22
31
+ * SPDX-License-Identifier: GPL-2.0-or-later
23
+struct Aspeed10x0SoCState {
32
+ * Copyright (C) 2024 IBM Corp.
24
+ AspeedSoCState parent;
33
+ *
34
+ * IBM Flexible Service Interface
35
+ */
36
+#ifndef FSI_FSI_H
37
+#define FSI_FSI_H
38
+
39
+#include "hw/qdev-core.h"
40
+
41
+#define TYPE_FSI_BUS "fsi.bus"
42
+OBJECT_DECLARE_SIMPLE_TYPE(FSIBus, FSI_BUS)
43
+
44
+typedef struct FSIBus {
45
+ BusState bus;
46
+} FSIBus;
47
+
48
+#endif /* FSI_FSI_H */
49
diff --git a/hw/fsi/fsi.c b/hw/fsi/fsi.c
50
new file mode 100644
51
index XXXXXXX..XXXXXXX
52
--- /dev/null
53
+++ b/hw/fsi/fsi.c
54
@@ -XXX,XX +XXX,XX @@
55
+/*
56
+ * SPDX-License-Identifier: GPL-2.0-or-later
57
+ * Copyright (C) 2024 IBM Corp.
58
+ *
59
+ * IBM Flexible Service Interface
60
+ */
61
+#include "qemu/osdep.h"
62
+
63
+#include "hw/fsi/fsi.h"
64
+
65
+static const TypeInfo fsi_bus_info = {
66
+ .name = TYPE_FSI_BUS,
67
+ .parent = TYPE_BUS,
68
+ .instance_size = sizeof(FSIBus),
25
+};
69
+};
26
+
70
+
27
+#define TYPE_ASPEED10X0_SOC "aspeed10x0-soc"
71
+static void fsi_bus_register_types(void)
28
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed10x0SoCState, ASPEED10X0_SOC)
72
+{
73
+ type_register_static(&fsi_bus_info);
74
+}
29
+
75
+
30
struct AspeedSoCClass {
76
+type_init(fsi_bus_register_types);
31
DeviceClass parent_class;
77
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
32
33
diff --git a/hw/arm/aspeed_ast10x0.c b/hw/arm/aspeed_ast10x0.c
34
index XXXXXXX..XXXXXXX 100644
78
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/aspeed_ast10x0.c
79
--- a/hw/fsi/meson.build
36
+++ b/hw/arm/aspeed_ast10x0.c
80
+++ b/hw/fsi/meson.build
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast1030_class_init(ObjectClass *klass, void *data)
81
@@ -1 +1 @@
38
sc->get_irq = aspeed_soc_ast1030_get_irq;
82
-system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c'))
39
}
83
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c'))
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
+ },
60
};
61
62
-static void aspeed_soc_register_types(void)
63
-{
64
- type_register_static(&aspeed_soc_ast1030_type_info);
65
-}
66
-
67
-type_init(aspeed_soc_register_types)
68
+DEFINE_TYPES(aspeed_soc_ast10x0_types)
69
--
84
--
70
2.41.0
85
2.43.0
71
86
72
87
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
3
This is a part of patchset where IBM's Flexible Service Interface is
4
introduced.
5
6
The FSI slave: The slave is the terminal point of the FSI bus for
7
FSI symbols addressed to it. Slaves can be cascaded off of one
8
another. The slave's configuration registers appear in address space
9
of the CFAM to which it is attached.
10
11
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
12
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
4
Reviewed-by: Cédric Le Goater <clg@kaod.org>
13
Reviewed-by: Cédric Le Goater <clg@kaod.org>
5
Signed-off-by: Cédric Le Goater <clg@kaod.org>
14
Signed-off-by: Cédric Le Goater <clg@kaod.org>
6
---
15
---
7
hw/arm/aspeed_soc_common.c | 11 +++++++++++
16
include/hw/fsi/fsi.h | 18 ++++++++++
8
1 file changed, 11 insertions(+)
17
hw/fsi/fsi.c | 84 ++++++++++++++++++++++++++++++++++++++++++--
18
hw/fsi/trace-events | 2 ++
19
3 files changed, 102 insertions(+), 2 deletions(-)
9
20
10
diff --git a/hw/arm/aspeed_soc_common.c b/hw/arm/aspeed_soc_common.c
21
diff --git a/include/hw/fsi/fsi.h b/include/hw/fsi/fsi.h
11
index XXXXXXX..XXXXXXX 100644
22
index XXXXXXX..XXXXXXX 100644
12
--- a/hw/arm/aspeed_soc_common.c
23
--- a/include/hw/fsi/fsi.h
13
+++ b/hw/arm/aspeed_soc_common.c
24
+++ b/include/hw/fsi/fsi.h
14
@@ -XXX,XX +XXX,XX @@ void aspeed_mmio_map_unimplemented(AspeedSoCState *s, SysBusDevice *dev,
25
@@ -XXX,XX +XXX,XX @@
15
sysbus_mmio_get_region(dev, 0), -1000);
26
#ifndef FSI_FSI_H
16
}
27
#define FSI_FSI_H
17
28
18
+static void aspeed_soc_realize(DeviceState *dev, Error **errp)
29
+#include "exec/memory.h"
30
#include "hw/qdev-core.h"
31
+#include "hw/fsi/lbus.h"
32
+#include "qemu/bitops.h"
33
+
34
+/* Bitwise operations at the word level. */
35
+#define BE_GENMASK(hb, lb) MAKE_64BIT_MASK((lb), ((hb) - (lb) + 1))
36
37
#define TYPE_FSI_BUS "fsi.bus"
38
OBJECT_DECLARE_SIMPLE_TYPE(FSIBus, FSI_BUS)
39
@@ -XXX,XX +XXX,XX @@ typedef struct FSIBus {
40
BusState bus;
41
} FSIBus;
42
43
+#define TYPE_FSI_SLAVE "fsi.slave"
44
+OBJECT_DECLARE_SIMPLE_TYPE(FSISlaveState, FSI_SLAVE)
45
+
46
+#define FSI_SLAVE_CONTROL_NR_REGS ((0x40 >> 2) + 1)
47
+
48
+typedef struct FSISlaveState {
49
+ DeviceState parent;
50
+
51
+ MemoryRegion iomem;
52
+ uint32_t regs[FSI_SLAVE_CONTROL_NR_REGS];
53
+} FSISlaveState;
54
+
55
#endif /* FSI_FSI_H */
56
diff --git a/hw/fsi/fsi.c b/hw/fsi/fsi.c
57
index XXXXXXX..XXXXXXX 100644
58
--- a/hw/fsi/fsi.c
59
+++ b/hw/fsi/fsi.c
60
@@ -XXX,XX +XXX,XX @@
61
* IBM Flexible Service Interface
62
*/
63
#include "qemu/osdep.h"
64
+#include "qapi/error.h"
65
+#include "qemu/log.h"
66
+#include "trace.h"
67
68
#include "hw/fsi/fsi.h"
69
70
+#define TO_REG(x) ((x) >> 2)
71
+
72
static const TypeInfo fsi_bus_info = {
73
.name = TYPE_FSI_BUS,
74
.parent = TYPE_BUS,
75
.instance_size = sizeof(FSIBus),
76
};
77
78
-static void fsi_bus_register_types(void)
79
+static uint64_t fsi_slave_read(void *opaque, hwaddr addr, unsigned size)
19
+{
80
+{
20
+ AspeedSoCState *s = ASPEED_SOC(dev);
81
+ FSISlaveState *s = FSI_SLAVE(opaque);
82
+ int reg = TO_REG(addr);
21
+
83
+
22
+ if (!s->memory) {
84
+ trace_fsi_slave_read(addr, size);
23
+ error_setg(errp, "'memory' link is not set");
85
+
86
+ if (reg >= FSI_SLAVE_CONTROL_NR_REGS) {
87
+ qemu_log_mask(LOG_GUEST_ERROR,
88
+ "%s: Out of bounds read: 0x%"HWADDR_PRIx" for %u\n",
89
+ __func__, addr, size);
90
+ return 0;
91
+ }
92
+
93
+ return s->regs[reg];
94
+}
95
+
96
+static void fsi_slave_write(void *opaque, hwaddr addr, uint64_t data,
97
+ unsigned size)
98
+{
99
+ FSISlaveState *s = FSI_SLAVE(opaque);
100
+ int reg = TO_REG(addr);
101
+
102
+ trace_fsi_slave_write(addr, size, data);
103
+
104
+ if (reg >= FSI_SLAVE_CONTROL_NR_REGS) {
105
+ qemu_log_mask(LOG_GUEST_ERROR,
106
+ "%s: Out of bounds write: 0x%"HWADDR_PRIx" for %u\n",
107
+ __func__, addr, size);
24
+ return;
108
+ return;
25
+ }
109
+ }
110
+
111
+ s->regs[reg] = data;
26
+}
112
+}
27
+
113
+
28
static Property aspeed_soc_properties[] = {
114
+static const struct MemoryRegionOps fsi_slave_ops = {
29
DEFINE_PROP_LINK("dram", AspeedSoCState, dram_mr, TYPE_MEMORY_REGION,
115
+ .read = fsi_slave_read,
30
MemoryRegion *),
116
+ .write = fsi_slave_write,
31
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_class_init(ObjectClass *oc, void *data)
117
+ .endianness = DEVICE_BIG_ENDIAN,
118
+};
119
+
120
+static void fsi_slave_reset(DeviceState *dev)
121
+{
122
+ FSISlaveState *s = FSI_SLAVE(dev);
123
+
124
+ /* Initialize registers */
125
+ memset(s->regs, 0, sizeof(s->regs));
126
+}
127
+
128
+static void fsi_slave_init(Object *o)
129
+{
130
+ FSISlaveState *s = FSI_SLAVE(o);
131
+
132
+ memory_region_init_io(&s->iomem, OBJECT(s), &fsi_slave_ops,
133
+ s, TYPE_FSI_SLAVE, 0x400);
134
+}
135
+
136
+static void fsi_slave_class_init(ObjectClass *klass, void *data)
137
+{
138
+ DeviceClass *dc = DEVICE_CLASS(klass);
139
+
140
+ dc->bus_type = TYPE_FSI_BUS;
141
+ dc->desc = "FSI Slave";
142
+ dc->reset = fsi_slave_reset;
143
+}
144
+
145
+static const TypeInfo fsi_slave_info = {
146
+ .name = TYPE_FSI_SLAVE,
147
+ .parent = TYPE_DEVICE,
148
+ .instance_init = fsi_slave_init,
149
+ .instance_size = sizeof(FSISlaveState),
150
+ .class_init = fsi_slave_class_init,
151
+};
152
+
153
+static void fsi_register_types(void)
32
{
154
{
33
DeviceClass *dc = DEVICE_CLASS(oc);
155
type_register_static(&fsi_bus_info);
34
156
+ type_register_static(&fsi_slave_info);
35
+ dc->realize = aspeed_soc_realize;
36
device_class_set_props(dc, aspeed_soc_properties);
37
}
157
}
38
158
159
-type_init(fsi_bus_register_types);
160
+type_init(fsi_register_types);
161
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
162
index XXXXXXX..XXXXXXX 100644
163
--- a/hw/fsi/trace-events
164
+++ b/hw/fsi/trace-events
165
@@ -XXX,XX +XXX,XX @@
166
fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
167
fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
168
+fsi_slave_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
169
+fsi_slave_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
39
--
170
--
40
2.41.0
171
2.43.0
41
172
42
173
diff view generated by jsdifflib
New patch
1
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
3
This is a part of patchset where IBM's Flexible Service Interface is
4
introduced.
5
6
The Common FRU Access Macro (CFAM), an address space containing
7
various "engines" that drive accesses on busses internal and external
8
to the POWER chip. Examples include the SBEFIFO and I2C masters. The
9
engines hang off of an internal Local Bus (LBUS) which is described
10
by the CFAM configuration block.
11
12
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
13
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
14
Reviewed-by: Cédric Le Goater <clg@kaod.org>
15
[ clg: - moved object FSIScratchPad under FSICFAMState
16
- moved FSIScratchPad code under cfam.c
17
- introduced fsi_cfam_instance_init()
18
- reworked fsi_cfam_realize() ]
19
Signed-off-by: Cédric Le Goater <clg@kaod.org>
20
---
21
include/hw/fsi/cfam.h | 34 +++++++++
22
hw/fsi/cfam.c | 168 ++++++++++++++++++++++++++++++++++++++++++
23
hw/fsi/meson.build | 2 +-
24
hw/fsi/trace-events | 5 ++
25
4 files changed, 208 insertions(+), 1 deletion(-)
26
create mode 100644 include/hw/fsi/cfam.h
27
create mode 100644 hw/fsi/cfam.c
28
29
diff --git a/include/hw/fsi/cfam.h b/include/hw/fsi/cfam.h
30
new file mode 100644
31
index XXXXXXX..XXXXXXX
32
--- /dev/null
33
+++ b/include/hw/fsi/cfam.h
34
@@ -XXX,XX +XXX,XX @@
35
+/*
36
+ * SPDX-License-Identifier: GPL-2.0-or-later
37
+ * Copyright (C) 2024 IBM Corp.
38
+ *
39
+ * IBM Common FRU Access Macro
40
+ */
41
+#ifndef FSI_CFAM_H
42
+#define FSI_CFAM_H
43
+
44
+#include "exec/memory.h"
45
+
46
+#include "hw/fsi/fsi.h"
47
+#include "hw/fsi/lbus.h"
48
+
49
+#define TYPE_FSI_CFAM "cfam"
50
+#define FSI_CFAM(obj) OBJECT_CHECK(FSICFAMState, (obj), TYPE_FSI_CFAM)
51
+
52
+/* P9-ism */
53
+#define CFAM_CONFIG_NR_REGS 0x28
54
+
55
+typedef struct FSICFAMState {
56
+ /* < private > */
57
+ FSISlaveState parent;
58
+
59
+ /* CFAM config address space */
60
+ MemoryRegion config_iomem;
61
+
62
+ MemoryRegion mr;
63
+
64
+ FSILBus lbus;
65
+ FSIScratchPad scratchpad;
66
+} FSICFAMState;
67
+
68
+#endif /* FSI_CFAM_H */
69
diff --git a/hw/fsi/cfam.c b/hw/fsi/cfam.c
70
new file mode 100644
71
index XXXXXXX..XXXXXXX
72
--- /dev/null
73
+++ b/hw/fsi/cfam.c
74
@@ -XXX,XX +XXX,XX @@
75
+/*
76
+ * SPDX-License-Identifier: GPL-2.0-or-later
77
+ * Copyright (C) 2024 IBM Corp.
78
+ *
79
+ * IBM Common FRU Access Macro
80
+ */
81
+
82
+#include "qemu/osdep.h"
83
+#include "qemu/units.h"
84
+
85
+#include "qapi/error.h"
86
+#include "trace.h"
87
+
88
+#include "hw/fsi/cfam.h"
89
+#include "hw/fsi/fsi.h"
90
+
91
+#include "hw/qdev-properties.h"
92
+
93
+#define ENGINE_CONFIG_NEXT BIT(31)
94
+#define ENGINE_CONFIG_TYPE_PEEK (0x02 << 4)
95
+#define ENGINE_CONFIG_TYPE_FSI (0x03 << 4)
96
+#define ENGINE_CONFIG_TYPE_SCRATCHPAD (0x06 << 4)
97
+
98
+/* Valid, slots, version, type, crc */
99
+#define CFAM_CONFIG_REG(__VER, __TYPE, __CRC) \
100
+ (ENGINE_CONFIG_NEXT | \
101
+ 0x00010000 | \
102
+ (__VER) | \
103
+ (__TYPE) | \
104
+ (__CRC))
105
+
106
+#define TO_REG(x) ((x) >> 2)
107
+
108
+#define CFAM_CONFIG_CHIP_ID TO_REG(0x00)
109
+#define CFAM_CONFIG_PEEK_STATUS TO_REG(0x04)
110
+#define CFAM_CONFIG_CHIP_ID_P9 0xc0022d15
111
+#define CFAM_CONFIG_CHIP_ID_BREAK 0xc0de0000
112
+
113
+static uint64_t fsi_cfam_config_read(void *opaque, hwaddr addr, unsigned size)
114
+{
115
+ trace_fsi_cfam_config_read(addr, size);
116
+
117
+ switch (addr) {
118
+ case 0x00:
119
+ return CFAM_CONFIG_CHIP_ID_P9;
120
+ case 0x04:
121
+ return CFAM_CONFIG_REG(0x1000, ENGINE_CONFIG_TYPE_PEEK, 0xc);
122
+ case 0x08:
123
+ return CFAM_CONFIG_REG(0x5000, ENGINE_CONFIG_TYPE_FSI, 0xa);
124
+ case 0xc:
125
+ return CFAM_CONFIG_REG(0x1000, ENGINE_CONFIG_TYPE_SCRATCHPAD, 0x7);
126
+ default:
127
+ /*
128
+ * The config table contains different engines from 0xc onwards.
129
+ * The scratch pad is already added at address 0xc. We need to add
130
+ * future engines from address 0x10 onwards. Returning 0 as engine
131
+ * is not implemented.
132
+ */
133
+ return 0;
134
+ }
135
+}
136
+
137
+static void fsi_cfam_config_write(void *opaque, hwaddr addr, uint64_t data,
138
+ unsigned size)
139
+{
140
+ FSICFAMState *cfam = FSI_CFAM(opaque);
141
+
142
+ trace_fsi_cfam_config_write(addr, size, data);
143
+
144
+ switch (TO_REG(addr)) {
145
+ case CFAM_CONFIG_CHIP_ID:
146
+ case CFAM_CONFIG_PEEK_STATUS:
147
+ if (data == CFAM_CONFIG_CHIP_ID_BREAK) {
148
+ bus_cold_reset(BUS(&cfam->lbus));
149
+ }
150
+ break;
151
+ default:
152
+ trace_fsi_cfam_config_write_noaddr(addr, size, data);
153
+ }
154
+}
155
+
156
+static const struct MemoryRegionOps cfam_config_ops = {
157
+ .read = fsi_cfam_config_read,
158
+ .write = fsi_cfam_config_write,
159
+ .valid.max_access_size = 4,
160
+ .valid.min_access_size = 4,
161
+ .impl.max_access_size = 4,
162
+ .impl.min_access_size = 4,
163
+ .endianness = DEVICE_BIG_ENDIAN,
164
+};
165
+
166
+static uint64_t fsi_cfam_unimplemented_read(void *opaque, hwaddr addr,
167
+ unsigned size)
168
+{
169
+ trace_fsi_cfam_unimplemented_read(addr, size);
170
+
171
+ return 0;
172
+}
173
+
174
+static void fsi_cfam_unimplemented_write(void *opaque, hwaddr addr,
175
+ uint64_t data, unsigned size)
176
+{
177
+ trace_fsi_cfam_unimplemented_write(addr, size, data);
178
+}
179
+
180
+static const struct MemoryRegionOps fsi_cfam_unimplemented_ops = {
181
+ .read = fsi_cfam_unimplemented_read,
182
+ .write = fsi_cfam_unimplemented_write,
183
+ .endianness = DEVICE_BIG_ENDIAN,
184
+};
185
+
186
+static void fsi_cfam_instance_init(Object *obj)
187
+{
188
+ FSICFAMState *s = FSI_CFAM(obj);
189
+
190
+ object_initialize_child(obj, "scratchpad", &s->scratchpad,
191
+ TYPE_FSI_SCRATCHPAD);
192
+}
193
+
194
+static void fsi_cfam_realize(DeviceState *dev, Error **errp)
195
+{
196
+ FSICFAMState *cfam = FSI_CFAM(dev);
197
+ FSISlaveState *slave = FSI_SLAVE(dev);
198
+
199
+ /* Each slave has a 2MiB address space */
200
+ memory_region_init_io(&cfam->mr, OBJECT(cfam), &fsi_cfam_unimplemented_ops,
201
+ cfam, TYPE_FSI_CFAM, 2 * MiB);
202
+
203
+ qbus_init(&cfam->lbus, sizeof(cfam->lbus), TYPE_FSI_LBUS, DEVICE(cfam),
204
+ NULL);
205
+
206
+ memory_region_init_io(&cfam->config_iomem, OBJECT(cfam), &cfam_config_ops,
207
+ cfam, TYPE_FSI_CFAM ".config", 0x400);
208
+
209
+ memory_region_add_subregion(&cfam->mr, 0, &cfam->config_iomem);
210
+ memory_region_add_subregion(&cfam->mr, 0x800, &slave->iomem);
211
+ memory_region_add_subregion(&cfam->mr, 0xc00, &cfam->lbus.mr);
212
+
213
+ /* Add scratchpad engine */
214
+ if (!qdev_realize(DEVICE(&cfam->scratchpad), BUS(&cfam->lbus), errp)) {
215
+ return;
216
+ }
217
+
218
+ FSILBusDevice *fsi_dev = FSI_LBUS_DEVICE(&cfam->scratchpad);
219
+ memory_region_add_subregion(&cfam->lbus.mr, 0, &fsi_dev->iomem);
220
+}
221
+
222
+static void fsi_cfam_class_init(ObjectClass *klass, void *data)
223
+{
224
+ DeviceClass *dc = DEVICE_CLASS(klass);
225
+ dc->bus_type = TYPE_FSI_BUS;
226
+ dc->realize = fsi_cfam_realize;
227
+}
228
+
229
+static const TypeInfo fsi_cfam_info = {
230
+ .name = TYPE_FSI_CFAM,
231
+ .parent = TYPE_FSI_SLAVE,
232
+ .instance_init = fsi_cfam_instance_init,
233
+ .instance_size = sizeof(FSICFAMState),
234
+ .class_init = fsi_cfam_class_init,
235
+};
236
+
237
+static void fsi_cfam_register_types(void)
238
+{
239
+ type_register_static(&fsi_cfam_info);
240
+}
241
+
242
+type_init(fsi_cfam_register_types);
243
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
244
index XXXXXXX..XXXXXXX 100644
245
--- a/hw/fsi/meson.build
246
+++ b/hw/fsi/meson.build
247
@@ -1 +1 @@
248
-system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c'))
249
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c'))
250
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
251
index XXXXXXX..XXXXXXX 100644
252
--- a/hw/fsi/trace-events
253
+++ b/hw/fsi/trace-events
254
@@ -XXX,XX +XXX,XX @@ fsi_scratchpad_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
255
fsi_scratchpad_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
256
fsi_slave_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
257
fsi_slave_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
258
+fsi_cfam_config_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
259
+fsi_cfam_config_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
260
+fsi_cfam_unimplemented_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
261
+fsi_cfam_unimplemented_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
262
+fsi_cfam_config_write_noaddr(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
263
--
264
2.43.0
265
266
diff view generated by jsdifflib
New patch
1
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
3
This is a part of patchset where IBM's Flexible Service Interface is
4
introduced.
5
6
This commit models the FSI master. CFAM is hanging out of FSI master which is a bus controller.
7
8
The FSI master: A controller in the platform service processor (e.g.
9
BMC) driving CFAM engine accesses into the POWER chip. At the
10
hardware level FSI is a bit-based protocol supporting synchronous and
11
DMA-driven accesses of engines in a CFAM.
12
13
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
14
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
15
Reviewed-by: Cédric Le Goater <clg@kaod.org>
16
[ clg: - move FSICFAMState object under FSIMasterState
17
- introduced fsi_master_init()
18
- reworked fsi_master_realize()
19
- dropped FSIBus definition ]
20
Signed-off-by: Cédric Le Goater <clg@kaod.org>
21
---
22
include/hw/fsi/fsi-master.h | 32 +++++++
23
hw/fsi/fsi-master.c | 170 ++++++++++++++++++++++++++++++++++++
24
hw/fsi/meson.build | 2 +-
25
hw/fsi/trace-events | 2 +
26
4 files changed, 205 insertions(+), 1 deletion(-)
27
create mode 100644 include/hw/fsi/fsi-master.h
28
create mode 100644 hw/fsi/fsi-master.c
29
30
diff --git a/include/hw/fsi/fsi-master.h b/include/hw/fsi/fsi-master.h
31
new file mode 100644
32
index XXXXXXX..XXXXXXX
33
--- /dev/null
34
+++ b/include/hw/fsi/fsi-master.h
35
@@ -XXX,XX +XXX,XX @@
36
+/*
37
+ * SPDX-License-Identifier: GPL-2.0-or-later
38
+ * Copyright (C) 2024 IBM Corp.
39
+ *
40
+ * IBM Flexible Service Interface Master
41
+ */
42
+#ifndef FSI_FSI_MASTER_H
43
+#define FSI_FSI_MASTER_H
44
+
45
+#include "exec/memory.h"
46
+#include "hw/qdev-core.h"
47
+#include "hw/fsi/fsi.h"
48
+#include "hw/fsi/cfam.h"
49
+
50
+#define TYPE_FSI_MASTER "fsi.master"
51
+OBJECT_DECLARE_SIMPLE_TYPE(FSIMasterState, FSI_MASTER)
52
+
53
+#define FSI_MASTER_NR_REGS ((0x2e0 >> 2) + 1)
54
+
55
+typedef struct FSIMasterState {
56
+ DeviceState parent;
57
+ MemoryRegion iomem;
58
+ MemoryRegion opb2fsi;
59
+
60
+ FSIBus bus;
61
+
62
+ uint32_t regs[FSI_MASTER_NR_REGS];
63
+ FSICFAMState cfam;
64
+} FSIMasterState;
65
+
66
+
67
+#endif /* FSI_FSI_H */
68
diff --git a/hw/fsi/fsi-master.c b/hw/fsi/fsi-master.c
69
new file mode 100644
70
index XXXXXXX..XXXXXXX
71
--- /dev/null
72
+++ b/hw/fsi/fsi-master.c
73
@@ -XXX,XX +XXX,XX @@
74
+/*
75
+ * SPDX-License-Identifier: GPL-2.0-or-later
76
+ * Copyright (C) 2024 IBM Corp.
77
+ *
78
+ * IBM Flexible Service Interface master
79
+ */
80
+
81
+#include "qemu/osdep.h"
82
+#include "qapi/error.h"
83
+#include "qemu/log.h"
84
+#include "trace.h"
85
+
86
+#include "hw/fsi/fsi-master.h"
87
+
88
+#define TYPE_OP_BUS "opb"
89
+
90
+#define TO_REG(x) ((x) >> 2)
91
+
92
+#define FSI_MENP0 TO_REG(0x010)
93
+#define FSI_MENP32 TO_REG(0x014)
94
+#define FSI_MSENP0 TO_REG(0x018)
95
+#define FSI_MLEVP0 TO_REG(0x018)
96
+#define FSI_MSENP32 TO_REG(0x01c)
97
+#define FSI_MLEVP32 TO_REG(0x01c)
98
+#define FSI_MCENP0 TO_REG(0x020)
99
+#define FSI_MREFP0 TO_REG(0x020)
100
+#define FSI_MCENP32 TO_REG(0x024)
101
+#define FSI_MREFP32 TO_REG(0x024)
102
+
103
+#define FSI_MVER TO_REG(0x074)
104
+#define FSI_MRESP0 TO_REG(0x0d0)
105
+
106
+#define FSI_MRESB0 TO_REG(0x1d0)
107
+#define FSI_MRESB0_RESET_GENERAL BIT(31)
108
+#define FSI_MRESB0_RESET_ERROR BIT(30)
109
+
110
+static uint64_t fsi_master_read(void *opaque, hwaddr addr, unsigned size)
111
+{
112
+ FSIMasterState *s = FSI_MASTER(opaque);
113
+ int reg = TO_REG(addr);
114
+
115
+ trace_fsi_master_read(addr, size);
116
+
117
+ if (reg >= FSI_MASTER_NR_REGS) {
118
+ qemu_log_mask(LOG_GUEST_ERROR,
119
+ "%s: Out of bounds read: 0x%"HWADDR_PRIx" for %u\n",
120
+ __func__, addr, size);
121
+ return 0;
122
+ }
123
+
124
+ return s->regs[reg];
125
+}
126
+
127
+static void fsi_master_write(void *opaque, hwaddr addr, uint64_t data,
128
+ unsigned size)
129
+{
130
+ FSIMasterState *s = FSI_MASTER(opaque);
131
+ int reg = TO_REG(addr);
132
+
133
+ trace_fsi_master_write(addr, size, data);
134
+
135
+ if (reg >= FSI_MASTER_NR_REGS) {
136
+ qemu_log_mask(LOG_GUEST_ERROR,
137
+ "%s: Out of bounds write: %"HWADDR_PRIx" for %u\n",
138
+ __func__, addr, size);
139
+ return;
140
+ }
141
+
142
+ switch (reg) {
143
+ case FSI_MENP0:
144
+ s->regs[FSI_MENP0] = data;
145
+ break;
146
+ case FSI_MENP32:
147
+ s->regs[FSI_MENP32] = data;
148
+ break;
149
+ case FSI_MSENP0:
150
+ s->regs[FSI_MENP0] |= data;
151
+ break;
152
+ case FSI_MSENP32:
153
+ s->regs[FSI_MENP32] |= data;
154
+ break;
155
+ case FSI_MCENP0:
156
+ s->regs[FSI_MENP0] &= ~data;
157
+ break;
158
+ case FSI_MCENP32:
159
+ s->regs[FSI_MENP32] &= ~data;
160
+ break;
161
+ case FSI_MRESP0:
162
+ /* Perform necessary resets leave register 0 to indicate no errors */
163
+ break;
164
+ case FSI_MRESB0:
165
+ if (data & FSI_MRESB0_RESET_GENERAL) {
166
+ device_cold_reset(DEVICE(opaque));
167
+ }
168
+ if (data & FSI_MRESB0_RESET_ERROR) {
169
+ /* FIXME: this seems dubious */
170
+ device_cold_reset(DEVICE(opaque));
171
+ }
172
+ break;
173
+ default:
174
+ s->regs[reg] = data;
175
+ }
176
+}
177
+
178
+static const struct MemoryRegionOps fsi_master_ops = {
179
+ .read = fsi_master_read,
180
+ .write = fsi_master_write,
181
+ .endianness = DEVICE_BIG_ENDIAN,
182
+};
183
+
184
+static void fsi_master_init(Object *o)
185
+{
186
+ FSIMasterState *s = FSI_MASTER(o);
187
+
188
+ object_initialize_child(o, "cfam", &s->cfam, TYPE_FSI_CFAM);
189
+
190
+ qbus_init(&s->bus, sizeof(s->bus), TYPE_FSI_BUS, DEVICE(s), NULL);
191
+
192
+ memory_region_init_io(&s->iomem, OBJECT(s), &fsi_master_ops, s,
193
+ TYPE_FSI_MASTER, 0x10000000);
194
+ memory_region_init(&s->opb2fsi, OBJECT(s), "fsi.opb2fsi", 0x10000000);
195
+}
196
+
197
+static void fsi_master_realize(DeviceState *dev, Error **errp)
198
+{
199
+ FSIMasterState *s = FSI_MASTER(dev);
200
+
201
+ if (!qdev_realize(DEVICE(&s->cfam), BUS(&s->bus), errp)) {
202
+ return;
203
+ }
204
+
205
+ /* address ? */
206
+ memory_region_add_subregion(&s->opb2fsi, 0, &s->cfam.mr);
207
+}
208
+
209
+static void fsi_master_reset(DeviceState *dev)
210
+{
211
+ FSIMasterState *s = FSI_MASTER(dev);
212
+
213
+ /* Initialize registers */
214
+ memset(s->regs, 0, sizeof(s->regs));
215
+
216
+ /* ASPEED default */
217
+ s->regs[FSI_MVER] = 0xe0050101;
218
+}
219
+
220
+static void fsi_master_class_init(ObjectClass *klass, void *data)
221
+{
222
+ DeviceClass *dc = DEVICE_CLASS(klass);
223
+
224
+ dc->bus_type = TYPE_OP_BUS;
225
+ dc->desc = "FSI Master";
226
+ dc->realize = fsi_master_realize;
227
+ dc->reset = fsi_master_reset;
228
+}
229
+
230
+static const TypeInfo fsi_master_info = {
231
+ .name = TYPE_FSI_MASTER,
232
+ .parent = TYPE_DEVICE,
233
+ .instance_init = fsi_master_init,
234
+ .instance_size = sizeof(FSIMasterState),
235
+ .class_init = fsi_master_class_init,
236
+};
237
+
238
+static void fsi_register_types(void)
239
+{
240
+ type_register_static(&fsi_master_info);
241
+}
242
+
243
+type_init(fsi_register_types);
244
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
245
index XXXXXXX..XXXXXXX 100644
246
--- a/hw/fsi/meson.build
247
+++ b/hw/fsi/meson.build
248
@@ -1 +1 @@
249
-system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c'))
250
+system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c','fsi-master.c'))
251
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
252
index XXXXXXX..XXXXXXX 100644
253
--- a/hw/fsi/trace-events
254
+++ b/hw/fsi/trace-events
255
@@ -XXX,XX +XXX,XX @@ fsi_cfam_config_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64
256
fsi_cfam_unimplemented_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
257
fsi_cfam_unimplemented_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
258
fsi_cfam_config_write_noaddr(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
259
+fsi_master_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
260
+fsi_master_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
261
--
262
2.43.0
263
264
diff view generated by jsdifflib
New patch
1
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
3
This is a part of patchset where IBM's Flexible Service Interface is
4
introduced.
5
6
An APB-to-OPB bridge enabling access to the OPB from the ARM core in
7
the AST2600. Hardware limitations prevent the OPB from being directly
8
mapped into APB, so all accesses are indirect through the bridge.
9
10
The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in
11
POWER processors. This now makes an appearance in the ASPEED SoC due
12
to tight integration of the FSI master IP with the OPB, mainly the
13
existence of an MMIO-mapping of the CFAM address straight onto a
14
sub-region of the OPB address space.
15
16
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
17
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
18
Reviewed-by: Cédric Le Goater <clg@kaod.org>
19
[ clg: - moved FSIMasterState under AspeedAPB2OPBState
20
- modified fsi_opb_fsi_master_address() and
21
fsi_opb_opb2fsi_address()
22
- instroduced fsi_aspeed_apb2opb_init()
23
- reworked fsi_aspeed_apb2opb_realize()
24
- removed FSIMasterState object and fsi_opb_realize()
25
- simplified OPBus
26
- introduced fsi_aspeed_apb2opb_rw to fix endianness issue ]
27
Signed-off-by: Cédric Le Goater <clg@kaod.org>
28
---
29
include/hw/fsi/aspeed_apb2opb.h | 46 ++++
30
hw/fsi/aspeed_apb2opb.c | 367 ++++++++++++++++++++++++++++++++
31
hw/arm/Kconfig | 1 +
32
hw/fsi/Kconfig | 5 +
33
hw/fsi/meson.build | 1 +
34
hw/fsi/trace-events | 2 +
35
6 files changed, 422 insertions(+)
36
create mode 100644 include/hw/fsi/aspeed_apb2opb.h
37
create mode 100644 hw/fsi/aspeed_apb2opb.c
38
39
diff --git a/include/hw/fsi/aspeed_apb2opb.h b/include/hw/fsi/aspeed_apb2opb.h
40
new file mode 100644
41
index XXXXXXX..XXXXXXX
42
--- /dev/null
43
+++ b/include/hw/fsi/aspeed_apb2opb.h
44
@@ -XXX,XX +XXX,XX @@
45
+/*
46
+ * SPDX-License-Identifier: GPL-2.0-or-later
47
+ * Copyright (C) 2024 IBM Corp.
48
+ *
49
+ * ASPEED APB2OPB Bridge
50
+ * IBM On-Chip Peripheral Bus
51
+ */
52
+#ifndef FSI_ASPEED_APB2OPB_H
53
+#define FSI_ASPEED_APB2OPB_H
54
+
55
+#include "exec/memory.h"
56
+#include "hw/fsi/fsi-master.h"
57
+#include "hw/sysbus.h"
58
+
59
+#define TYPE_FSI_OPB "fsi.opb"
60
+
61
+#define TYPE_OP_BUS "opb"
62
+OBJECT_DECLARE_SIMPLE_TYPE(OPBus, OP_BUS)
63
+
64
+typedef struct OPBus {
65
+ BusState bus;
66
+
67
+ MemoryRegion mr;
68
+ AddressSpace as;
69
+} OPBus;
70
+
71
+#define TYPE_ASPEED_APB2OPB "aspeed.apb2opb"
72
+OBJECT_DECLARE_SIMPLE_TYPE(AspeedAPB2OPBState, ASPEED_APB2OPB)
73
+
74
+#define ASPEED_APB2OPB_NR_REGS ((0xe8 >> 2) + 1)
75
+
76
+#define ASPEED_FSI_NUM 2
77
+
78
+typedef struct AspeedAPB2OPBState {
79
+ SysBusDevice parent_obj;
80
+
81
+ MemoryRegion iomem;
82
+
83
+ uint32_t regs[ASPEED_APB2OPB_NR_REGS];
84
+ qemu_irq irq;
85
+
86
+ OPBus opb[ASPEED_FSI_NUM];
87
+ FSIMasterState fsi[ASPEED_FSI_NUM];
88
+} AspeedAPB2OPBState;
89
+
90
+#endif /* FSI_ASPEED_APB2OPB_H */
91
diff --git a/hw/fsi/aspeed_apb2opb.c b/hw/fsi/aspeed_apb2opb.c
92
new file mode 100644
93
index XXXXXXX..XXXXXXX
94
--- /dev/null
95
+++ b/hw/fsi/aspeed_apb2opb.c
96
@@ -XXX,XX +XXX,XX @@
97
+/*
98
+ * SPDX-License-Identifier: GPL-2.0-or-later
99
+ * Copyright (C) 2024 IBM Corp.
100
+ *
101
+ * ASPEED APB-OPB FSI interface
102
+ * IBM On-chip Peripheral Bus
103
+ */
104
+
105
+#include "qemu/osdep.h"
106
+#include "qemu/log.h"
107
+#include "qom/object.h"
108
+#include "qapi/error.h"
109
+#include "trace.h"
110
+
111
+#include "hw/fsi/aspeed_apb2opb.h"
112
+#include "hw/qdev-core.h"
113
+
114
+#define TO_REG(x) (x >> 2)
115
+
116
+#define APB2OPB_VERSION TO_REG(0x00)
117
+#define APB2OPB_TRIGGER TO_REG(0x04)
118
+
119
+#define APB2OPB_CONTROL TO_REG(0x08)
120
+#define APB2OPB_CONTROL_OFF BE_GENMASK(31, 13)
121
+
122
+#define APB2OPB_OPB2FSI TO_REG(0x0c)
123
+#define APB2OPB_OPB2FSI_OFF BE_GENMASK(31, 22)
124
+
125
+#define APB2OPB_OPB0_SEL TO_REG(0x10)
126
+#define APB2OPB_OPB1_SEL TO_REG(0x28)
127
+#define APB2OPB_OPB_SEL_EN BIT(0)
128
+
129
+#define APB2OPB_OPB0_MODE TO_REG(0x14)
130
+#define APB2OPB_OPB1_MODE TO_REG(0x2c)
131
+#define APB2OPB_OPB_MODE_RD BIT(0)
132
+
133
+#define APB2OPB_OPB0_XFER TO_REG(0x18)
134
+#define APB2OPB_OPB1_XFER TO_REG(0x30)
135
+#define APB2OPB_OPB_XFER_FULL BIT(1)
136
+#define APB2OPB_OPB_XFER_HALF BIT(0)
137
+
138
+#define APB2OPB_OPB0_ADDR TO_REG(0x1c)
139
+#define APB2OPB_OPB0_WRITE_DATA TO_REG(0x20)
140
+
141
+#define APB2OPB_OPB1_ADDR TO_REG(0x34)
142
+#define APB2OPB_OPB1_WRITE_DATA TO_REG(0x38)
143
+
144
+#define APB2OPB_IRQ_STS TO_REG(0x48)
145
+#define APB2OPB_IRQ_STS_OPB1_TX_ACK BIT(17)
146
+#define APB2OPB_IRQ_STS_OPB0_TX_ACK BIT(16)
147
+
148
+#define APB2OPB_OPB0_WRITE_WORD_ENDIAN TO_REG(0x4c)
149
+#define APB2OPB_OPB0_WRITE_WORD_ENDIAN_BE 0x0011101b
150
+#define APB2OPB_OPB0_WRITE_BYTE_ENDIAN TO_REG(0x50)
151
+#define APB2OPB_OPB0_WRITE_BYTE_ENDIAN_BE 0x0c330f3f
152
+#define APB2OPB_OPB1_WRITE_WORD_ENDIAN TO_REG(0x54)
153
+#define APB2OPB_OPB1_WRITE_BYTE_ENDIAN TO_REG(0x58)
154
+#define APB2OPB_OPB0_READ_BYTE_ENDIAN TO_REG(0x5c)
155
+#define APB2OPB_OPB1_READ_BYTE_ENDIAN TO_REG(0x60)
156
+#define APB2OPB_OPB0_READ_WORD_ENDIAN_BE 0x00030b1b
157
+
158
+#define APB2OPB_OPB0_READ_DATA TO_REG(0x84)
159
+#define APB2OPB_OPB1_READ_DATA TO_REG(0x90)
160
+
161
+/*
162
+ * The following magic values came from AST2600 data sheet
163
+ * The register values are defined under section "FSI controller"
164
+ * as initial values.
165
+ */
166
+static const uint32_t aspeed_apb2opb_reset[ASPEED_APB2OPB_NR_REGS] = {
167
+ [APB2OPB_VERSION] = 0x000000a1,
168
+ [APB2OPB_OPB0_WRITE_WORD_ENDIAN] = 0x0044eee4,
169
+ [APB2OPB_OPB0_WRITE_BYTE_ENDIAN] = 0x0055aaff,
170
+ [APB2OPB_OPB1_WRITE_WORD_ENDIAN] = 0x00117717,
171
+ [APB2OPB_OPB1_WRITE_BYTE_ENDIAN] = 0xffaa5500,
172
+ [APB2OPB_OPB0_READ_BYTE_ENDIAN] = 0x0044eee4,
173
+ [APB2OPB_OPB1_READ_BYTE_ENDIAN] = 0x00117717
174
+};
175
+
176
+static void fsi_opb_fsi_master_address(FSIMasterState *fsi, hwaddr addr)
177
+{
178
+ memory_region_transaction_begin();
179
+ memory_region_set_address(&fsi->iomem, addr);
180
+ memory_region_transaction_commit();
181
+}
182
+
183
+static void fsi_opb_opb2fsi_address(FSIMasterState *fsi, hwaddr addr)
184
+{
185
+ memory_region_transaction_begin();
186
+ memory_region_set_address(&fsi->opb2fsi, addr);
187
+ memory_region_transaction_commit();
188
+}
189
+
190
+static uint64_t fsi_aspeed_apb2opb_read(void *opaque, hwaddr addr,
191
+ unsigned size)
192
+{
193
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(opaque);
194
+ unsigned int reg = TO_REG(addr);
195
+
196
+ trace_fsi_aspeed_apb2opb_read(addr, size);
197
+
198
+ if (reg >= ASPEED_APB2OPB_NR_REGS) {
199
+ qemu_log_mask(LOG_GUEST_ERROR,
200
+ "%s: Out of bounds read: 0x%"HWADDR_PRIx" for %u\n",
201
+ __func__, addr, size);
202
+ return 0;
203
+ }
204
+
205
+ return s->regs[reg];
206
+}
207
+
208
+static MemTxResult fsi_aspeed_apb2opb_rw(AddressSpace *as, hwaddr addr,
209
+ MemTxAttrs attrs, uint32_t *data,
210
+ uint32_t size, bool is_write)
211
+{
212
+ MemTxResult res;
213
+
214
+ if (is_write) {
215
+ switch (size) {
216
+ case 4:
217
+ address_space_stl_le(as, addr, *data, attrs, &res);
218
+ break;
219
+ case 2:
220
+ address_space_stw_le(as, addr, *data, attrs, &res);
221
+ break;
222
+ case 1:
223
+ address_space_stb(as, addr, *data, attrs, &res);
224
+ break;
225
+ default:
226
+ g_assert_not_reached();
227
+ }
228
+ } else {
229
+ switch (size) {
230
+ case 4:
231
+ *data = address_space_ldl_le(as, addr, attrs, &res);
232
+ break;
233
+ case 2:
234
+ *data = address_space_lduw_le(as, addr, attrs, &res);
235
+ break;
236
+ case 1:
237
+ *data = address_space_ldub(as, addr, attrs, &res);
238
+ break;
239
+ default:
240
+ g_assert_not_reached();
241
+ }
242
+ }
243
+ return res;
244
+}
245
+
246
+static void fsi_aspeed_apb2opb_write(void *opaque, hwaddr addr, uint64_t data,
247
+ unsigned size)
248
+{
249
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(opaque);
250
+ unsigned int reg = TO_REG(addr);
251
+
252
+ trace_fsi_aspeed_apb2opb_write(addr, size, data);
253
+
254
+ if (reg >= ASPEED_APB2OPB_NR_REGS) {
255
+ qemu_log_mask(LOG_GUEST_ERROR,
256
+ "%s: Out of bounds write: %"HWADDR_PRIx" for %u\n",
257
+ __func__, addr, size);
258
+ return;
259
+ }
260
+
261
+ switch (reg) {
262
+ case APB2OPB_CONTROL:
263
+ fsi_opb_fsi_master_address(&s->fsi[0],
264
+ data & APB2OPB_CONTROL_OFF);
265
+ break;
266
+ case APB2OPB_OPB2FSI:
267
+ fsi_opb_opb2fsi_address(&s->fsi[0],
268
+ data & APB2OPB_OPB2FSI_OFF);
269
+ break;
270
+ case APB2OPB_OPB0_WRITE_WORD_ENDIAN:
271
+ if (data != APB2OPB_OPB0_WRITE_WORD_ENDIAN_BE) {
272
+ qemu_log_mask(LOG_GUEST_ERROR,
273
+ "%s: Bridge needs to be driven as BE (0x%x)\n",
274
+ __func__, APB2OPB_OPB0_WRITE_WORD_ENDIAN_BE);
275
+ }
276
+ break;
277
+ case APB2OPB_OPB0_WRITE_BYTE_ENDIAN:
278
+ if (data != APB2OPB_OPB0_WRITE_BYTE_ENDIAN_BE) {
279
+ qemu_log_mask(LOG_GUEST_ERROR,
280
+ "%s: Bridge needs to be driven as BE (0x%x)\n",
281
+ __func__, APB2OPB_OPB0_WRITE_BYTE_ENDIAN_BE);
282
+ }
283
+ break;
284
+ case APB2OPB_OPB0_READ_BYTE_ENDIAN:
285
+ if (data != APB2OPB_OPB0_READ_WORD_ENDIAN_BE) {
286
+ qemu_log_mask(LOG_GUEST_ERROR,
287
+ "%s: Bridge needs to be driven as BE (0x%x)\n",
288
+ __func__, APB2OPB_OPB0_READ_WORD_ENDIAN_BE);
289
+ }
290
+ break;
291
+ case APB2OPB_TRIGGER:
292
+ {
293
+ uint32_t opb, op_mode, op_size, op_addr, op_data;
294
+ MemTxResult result;
295
+ bool is_write;
296
+ int index;
297
+ AddressSpace *as;
298
+
299
+ assert((s->regs[APB2OPB_OPB0_SEL] & APB2OPB_OPB_SEL_EN) ^
300
+ (s->regs[APB2OPB_OPB1_SEL] & APB2OPB_OPB_SEL_EN));
301
+
302
+ if (s->regs[APB2OPB_OPB0_SEL] & APB2OPB_OPB_SEL_EN) {
303
+ opb = 0;
304
+ op_mode = s->regs[APB2OPB_OPB0_MODE];
305
+ op_size = s->regs[APB2OPB_OPB0_XFER];
306
+ op_addr = s->regs[APB2OPB_OPB0_ADDR];
307
+ op_data = s->regs[APB2OPB_OPB0_WRITE_DATA];
308
+ } else if (s->regs[APB2OPB_OPB1_SEL] & APB2OPB_OPB_SEL_EN) {
309
+ opb = 1;
310
+ op_mode = s->regs[APB2OPB_OPB1_MODE];
311
+ op_size = s->regs[APB2OPB_OPB1_XFER];
312
+ op_addr = s->regs[APB2OPB_OPB1_ADDR];
313
+ op_data = s->regs[APB2OPB_OPB1_WRITE_DATA];
314
+ } else {
315
+ qemu_log_mask(LOG_GUEST_ERROR,
316
+ "%s: Invalid operation: 0x%"HWADDR_PRIx" for %u\n",
317
+ __func__, addr, size);
318
+ return;
319
+ }
320
+
321
+ if (op_size & ~(APB2OPB_OPB_XFER_HALF | APB2OPB_OPB_XFER_FULL)) {
322
+ qemu_log_mask(LOG_GUEST_ERROR,
323
+ "OPB transaction failed: Unrecognized access width: %d\n",
324
+ op_size);
325
+ return;
326
+ }
327
+
328
+ op_size += 1;
329
+ is_write = !(op_mode & APB2OPB_OPB_MODE_RD);
330
+ index = opb ? APB2OPB_OPB1_READ_DATA : APB2OPB_OPB0_READ_DATA;
331
+ as = &s->opb[opb].as;
332
+
333
+ result = fsi_aspeed_apb2opb_rw(as, op_addr, MEMTXATTRS_UNSPECIFIED,
334
+ &op_data, op_size, is_write);
335
+ if (result != MEMTX_OK) {
336
+ qemu_log_mask(LOG_GUEST_ERROR, "%s: OPB %s failed @%08x\n",
337
+ __func__, is_write ? "write" : "read", op_addr);
338
+ return;
339
+ }
340
+
341
+ if (!is_write) {
342
+ s->regs[index] = op_data;
343
+ }
344
+
345
+ s->regs[APB2OPB_IRQ_STS] |= opb ? APB2OPB_IRQ_STS_OPB1_TX_ACK
346
+ : APB2OPB_IRQ_STS_OPB0_TX_ACK;
347
+ break;
348
+ }
349
+ }
350
+
351
+ s->regs[reg] = data;
352
+}
353
+
354
+static const struct MemoryRegionOps aspeed_apb2opb_ops = {
355
+ .read = fsi_aspeed_apb2opb_read,
356
+ .write = fsi_aspeed_apb2opb_write,
357
+ .valid.max_access_size = 4,
358
+ .valid.min_access_size = 4,
359
+ .impl.max_access_size = 4,
360
+ .impl.min_access_size = 4,
361
+ .endianness = DEVICE_LITTLE_ENDIAN,
362
+};
363
+
364
+static void fsi_aspeed_apb2opb_init(Object *o)
365
+{
366
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(o);
367
+ int i;
368
+
369
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
370
+ object_initialize_child(o, "fsi-master[*]", &s->fsi[i],
371
+ TYPE_FSI_MASTER);
372
+ }
373
+}
374
+
375
+static void fsi_aspeed_apb2opb_realize(DeviceState *dev, Error **errp)
376
+{
377
+ SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
378
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(dev);
379
+ int i;
380
+
381
+ /*
382
+ * TODO: The OPBus model initializes the OPB address space in
383
+ * the .instance_init handler and this is problematic for test
384
+ * device-introspect-test. To avoid a memory corruption and a QEMU
385
+ * crash, qbus_init() should be called from realize(). Something to
386
+ * improve. Possibly, OPBus could also be removed.
387
+ */
388
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
389
+ qbus_init(&s->opb[i], sizeof(s->opb[i]), TYPE_OP_BUS, DEVICE(s),
390
+ NULL);
391
+ }
392
+
393
+ sysbus_init_irq(sbd, &s->irq);
394
+
395
+ memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_apb2opb_ops, s,
396
+ TYPE_ASPEED_APB2OPB, 0x1000);
397
+ sysbus_init_mmio(sbd, &s->iomem);
398
+
399
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
400
+ if (!qdev_realize(DEVICE(&s->fsi[i]), BUS(&s->opb[i]), errp)) {
401
+ return;
402
+ }
403
+
404
+ memory_region_add_subregion(&s->opb[i].mr, 0x80000000,
405
+ &s->fsi[i].iomem);
406
+
407
+ memory_region_add_subregion(&s->opb[i].mr, 0xa0000000,
408
+ &s->fsi[i].opb2fsi);
409
+ }
410
+}
411
+
412
+static void fsi_aspeed_apb2opb_reset(DeviceState *dev)
413
+{
414
+ AspeedAPB2OPBState *s = ASPEED_APB2OPB(dev);
415
+
416
+ memcpy(s->regs, aspeed_apb2opb_reset, ASPEED_APB2OPB_NR_REGS);
417
+}
418
+
419
+static void fsi_aspeed_apb2opb_class_init(ObjectClass *klass, void *data)
420
+{
421
+ DeviceClass *dc = DEVICE_CLASS(klass);
422
+
423
+ dc->desc = "ASPEED APB2OPB Bridge";
424
+ dc->realize = fsi_aspeed_apb2opb_realize;
425
+ dc->reset = fsi_aspeed_apb2opb_reset;
426
+}
427
+
428
+static const TypeInfo aspeed_apb2opb_info = {
429
+ .name = TYPE_ASPEED_APB2OPB,
430
+ .parent = TYPE_SYS_BUS_DEVICE,
431
+ .instance_init = fsi_aspeed_apb2opb_init,
432
+ .instance_size = sizeof(AspeedAPB2OPBState),
433
+ .class_init = fsi_aspeed_apb2opb_class_init,
434
+};
435
+
436
+static void aspeed_apb2opb_register_types(void)
437
+{
438
+ type_register_static(&aspeed_apb2opb_info);
439
+}
440
+
441
+type_init(aspeed_apb2opb_register_types);
442
+
443
+static void fsi_opb_init(Object *o)
444
+{
445
+ OPBus *opb = OP_BUS(o);
446
+
447
+ memory_region_init(&opb->mr, 0, TYPE_FSI_OPB, UINT32_MAX);
448
+ address_space_init(&opb->as, &opb->mr, TYPE_FSI_OPB);
449
+}
450
+
451
+static const TypeInfo opb_info = {
452
+ .name = TYPE_OP_BUS,
453
+ .parent = TYPE_BUS,
454
+ .instance_init = fsi_opb_init,
455
+ .instance_size = sizeof(OPBus),
456
+};
457
+
458
+static void fsi_opb_register_types(void)
459
+{
460
+ type_register_static(&opb_info);
461
+}
462
+
463
+type_init(fsi_opb_register_types);
464
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
465
index XXXXXXX..XXXXXXX 100644
466
--- a/hw/arm/Kconfig
467
+++ b/hw/arm/Kconfig
468
@@ -XXX,XX +XXX,XX @@ config ASPEED_SOC
469
select LED
470
select PMBUS
471
select MAX31785
472
+ select FSI_APB2OPB_ASPEED
473
474
config MPS2
475
bool
476
diff --git a/hw/fsi/Kconfig b/hw/fsi/Kconfig
477
index XXXXXXX..XXXXXXX 100644
478
--- a/hw/fsi/Kconfig
479
+++ b/hw/fsi/Kconfig
480
@@ -XXX,XX +XXX,XX @@
481
+config FSI_APB2OPB_ASPEED
482
+ bool
483
+ depends on ASPEED_SOC
484
+ select FSI
485
+
486
config FSI
487
bool
488
diff --git a/hw/fsi/meson.build b/hw/fsi/meson.build
489
index XXXXXXX..XXXXXXX 100644
490
--- a/hw/fsi/meson.build
491
+++ b/hw/fsi/meson.build
492
@@ -1 +1,2 @@
493
system_ss.add(when: 'CONFIG_FSI', if_true: files('lbus.c','fsi.c','cfam.c','fsi-master.c'))
494
+system_ss.add(when: 'CONFIG_FSI_APB2OPB_ASPEED', if_true: files('aspeed_apb2opb.c'))
495
diff --git a/hw/fsi/trace-events b/hw/fsi/trace-events
496
index XXXXXXX..XXXXXXX 100644
497
--- a/hw/fsi/trace-events
498
+++ b/hw/fsi/trace-events
499
@@ -XXX,XX +XXX,XX @@ fsi_cfam_unimplemented_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%"
500
fsi_cfam_config_write_noaddr(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
501
fsi_master_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
502
fsi_master_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
503
+fsi_aspeed_apb2opb_read(uint64_t addr, uint32_t size) "@0x%" PRIx64 " size=%d"
504
+fsi_aspeed_apb2opb_write(uint64_t addr, uint32_t size, uint64_t data) "@0x%" PRIx64 " size=%d value=0x%"PRIx64
505
--
506
2.43.0
507
508
diff view generated by jsdifflib
1
From: Philippe Mathieu-Daudé <philmd@linaro.org>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
TYPE_ASPEED2600_SOC inherits from TYPE_ASPEED_SOC.
3
This patchset introduces IBM's Flexible Service Interface(FSI).
4
In few commits we'll add more fields, but to keep
5
review process simple, don't add any yet.
6
4
7
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
5
Time for some fun with inter-processor buses. FSI allows a service
6
processor access to the internal buses of a host POWER processor to
7
perform configuration or debugging.
8
9
FSI has long existed in POWER processes and so comes with some baggage,
10
including how it has been integrated into the ASPEED SoC.
11
12
Working backwards from the POWER processor, the fundamental pieces of
13
interest for the implementation are:
14
15
1. The Common FRU Access Macro (CFAM), an address space containing
16
various "engines" that drive accesses on buses internal and external
17
to the POWER chip. Examples include the SBEFIFO and I2C masters. The
18
engines hang off of an internal Local Bus (LBUS) which is described
19
by the CFAM configuration block.
20
21
2. The FSI slave: The slave is the terminal point of the FSI bus for
22
FSI symbols addressed to it. Slaves can be cascaded off of one
23
another. The slave's configuration registers appear in address space
24
of the CFAM to which it is attached.
25
26
3. The FSI master: A controller in the platform service processor (e.g.
27
BMC) driving CFAM engine accesses into the POWER chip. At the
28
hardware level FSI is a bit-based protocol supporting synchronous and
29
DMA-driven accesses of engines in a CFAM.
30
31
4. The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in
32
POWER processors. This now makes an appearance in the ASPEED SoC due
33
to tight integration of the FSI master IP with the OPB, mainly the
34
existence of an MMIO-mapping of the CFAM address straight onto a
35
sub-region of the OPB address space.
36
37
5. An APB-to-OPB bridge enabling access to the OPB from the ARM core in
38
the AST2600. Hardware limitations prevent the OPB from being directly
39
mapped into APB, so all accesses are indirect through the bridge.
40
41
The implementation appears as following in the qemu device tree:
42
43
(qemu) info qtree
44
bus: main-system-bus
45
type System
46
...
47
dev: aspeed.apb2opb, id ""
48
gpio-out "sysbus-irq" 1
49
mmio 000000001e79b000/0000000000001000
50
bus: opb.1
51
type opb
52
dev: fsi.master, id ""
53
bus: fsi.bus.1
54
type fsi.bus
55
dev: cfam.config, id ""
56
dev: cfam, id ""
57
bus: fsi.lbus.1
58
type lbus
59
dev: scratchpad, id ""
60
address = 0 (0x0)
61
bus: opb.0
62
type opb
63
dev: fsi.master, id ""
64
bus: fsi.bus.0
65
type fsi.bus
66
dev: cfam.config, id ""
67
dev: cfam, id ""
68
bus: fsi.lbus.0
69
type lbus
70
dev: scratchpad, id ""
71
address = 0 (0x0)
72
73
The LBUS is modelled to maintain the qdev bus hierarchy and to take
74
advantage of the object model to automatically generate the CFAM
75
configuration block. The configuration block presents engines in the
76
order they are attached to the CFAM's LBUS. Engine implementations
77
should subclass the LBusDevice and set the 'config' member of
78
LBusDeviceClass to match the engine's type.
79
80
CFAM designs offer a lot of flexibility, for instance it is possible for
81
a CFAM to be simultaneously driven from multiple FSI links. The modeling
82
is not so complete; it's assumed that each CFAM is attached to a single
83
FSI slave (as a consequence the CFAM subclasses the FSI slave).
84
85
As for FSI, its symbols and wire-protocol are not modelled at all. This
86
is not necessary to get FSI off the ground thanks to the mapping of the
87
CFAM address space onto the OPB address space - the models follow this
88
directly and map the CFAM memory region into the OPB's memory region.
89
Future work includes supporting more advanced accesses that drive the
90
FSI master directly rather than indirectly via the CFAM mapping, which
91
will require implementing the FSI state machine and methods for each of
92
the FSI symbols on the slave. Further down the track we can also look at
93
supporting the bitbanged SoftFSI drivers in Linux by extending the FSI
94
slave model to resolve sequences of GPIO IRQs into FSI symbols, and
95
calling the associated symbol method on the slave to map the access onto
96
the CFAM.
97
98
Testing:
99
Tested by reading cfam config address 0 on rainier machine type.
100
101
root@p10bmc:~# pdbg -a getcfam 0x0
102
p0: 0x0 = 0xc0022d15
103
104
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
105
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
106
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
8
Reviewed-by: Cédric Le Goater <clg@kaod.org>
107
Reviewed-by: Cédric Le Goater <clg@kaod.org>
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
108
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
109
---
11
include/hw/arm/aspeed_soc.h | 7 +++++++
110
include/hw/arm/aspeed_soc.h | 4 ++++
12
hw/arm/aspeed_ast2600.c | 26 +++++++++++++-------------
111
hw/arm/aspeed_ast2600.c | 19 +++++++++++++++++++
13
2 files changed, 20 insertions(+), 13 deletions(-)
112
2 files changed, 23 insertions(+)
14
113
15
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
114
diff --git a/include/hw/arm/aspeed_soc.h b/include/hw/arm/aspeed_soc.h
16
index XXXXXXX..XXXXXXX 100644
115
index XXXXXXX..XXXXXXX 100644
17
--- a/include/hw/arm/aspeed_soc.h
116
--- a/include/hw/arm/aspeed_soc.h
18
+++ b/include/hw/arm/aspeed_soc.h
117
+++ b/include/hw/arm/aspeed_soc.h
118
@@ -XXX,XX +XXX,XX @@
119
#include "hw/misc/aspeed_lpc.h"
120
#include "hw/misc/unimp.h"
121
#include "hw/misc/aspeed_peci.h"
122
+#include "hw/fsi/aspeed_apb2opb.h"
123
#include "hw/char/serial.h"
124
125
#define ASPEED_SPIS_NUM 2
19
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
126
@@ -XXX,XX +XXX,XX @@ struct AspeedSoCState {
127
UnimplementedDeviceState udc;
128
UnimplementedDeviceState sgpiom;
129
UnimplementedDeviceState jtag[ASPEED_JTAG_NUM];
130
+ AspeedAPB2OPBState fsi[2];
131
};
132
20
#define TYPE_ASPEED_SOC "aspeed-soc"
133
#define TYPE_ASPEED_SOC "aspeed-soc"
21
OBJECT_DECLARE_TYPE(AspeedSoCState, AspeedSoCClass, ASPEED_SOC)
134
@@ -XXX,XX +XXX,XX @@ enum {
22
135
ASPEED_DEV_SGPIOM,
23
+struct Aspeed2600SoCState {
136
ASPEED_DEV_JTAG0,
24
+ AspeedSoCState parent;
137
ASPEED_DEV_JTAG1,
25
+};
138
+ ASPEED_DEV_FSI1,
26
+
139
+ ASPEED_DEV_FSI2,
27
+#define TYPE_ASPEED2600_SOC "aspeed2600-soc"
28
+OBJECT_DECLARE_SIMPLE_TYPE(Aspeed2600SoCState, ASPEED2600_SOC)
29
+
30
struct Aspeed10x0SoCState {
31
AspeedSoCState parent;
32
};
140
};
141
142
#define ASPEED_SOC_SPI_BOOT_ADDR 0x0
33
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
143
diff --git a/hw/arm/aspeed_ast2600.c b/hw/arm/aspeed_ast2600.c
34
index XXXXXXX..XXXXXXX 100644
144
index XXXXXXX..XXXXXXX 100644
35
--- a/hw/arm/aspeed_ast2600.c
145
--- a/hw/arm/aspeed_ast2600.c
36
+++ b/hw/arm/aspeed_ast2600.c
146
+++ b/hw/arm/aspeed_ast2600.c
37
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
147
@@ -XXX,XX +XXX,XX @@ static const hwaddr aspeed_soc_ast2600_memmap[] = {
38
sc->get_irq = aspeed_soc_ast2600_get_irq;
148
[ASPEED_DEV_UART12] = 0x1E790600,
149
[ASPEED_DEV_UART13] = 0x1E790700,
150
[ASPEED_DEV_VUART] = 0x1E787000,
151
+ [ASPEED_DEV_FSI1] = 0x1E79B000,
152
+ [ASPEED_DEV_FSI2] = 0x1E79B100,
153
[ASPEED_DEV_I3C] = 0x1E7A0000,
154
[ASPEED_DEV_SDRAM] = 0x80000000,
155
};
156
@@ -XXX,XX +XXX,XX @@ static const int aspeed_soc_ast2600_irqmap[] = {
157
[ASPEED_DEV_ETH4] = 33,
158
[ASPEED_DEV_KCS] = 138, /* 138 -> 142 */
159
[ASPEED_DEV_DP] = 62,
160
+ [ASPEED_DEV_FSI1] = 100,
161
+ [ASPEED_DEV_FSI2] = 101,
162
[ASPEED_DEV_I3C] = 102, /* 102 -> 107 */
163
};
164
165
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_init(Object *obj)
166
object_initialize_child(obj, "emmc-boot-controller",
167
&s->emmc_boot_controller,
168
TYPE_UNIMPLEMENTED_DEVICE);
169
+
170
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
171
+ object_initialize_child(obj, "fsi[*]", &s->fsi[i], TYPE_ASPEED_APB2OPB);
172
+ }
39
}
173
}
40
174
41
-static const TypeInfo aspeed_soc_ast2600_type_info = {
175
/*
42
- .name = "ast2600-a3",
176
@@ -XXX,XX +XXX,XX @@ static void aspeed_soc_ast2600_realize(DeviceState *dev, Error **errp)
43
- .parent = TYPE_ASPEED_SOC,
177
return;
44
- .instance_size = sizeof(AspeedSoCState),
178
}
45
- .instance_init = aspeed_soc_ast2600_init,
179
aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->sbc), 0, sc->memmap[ASPEED_DEV_SBC]);
46
- .class_init = aspeed_soc_ast2600_class_init,
180
+
47
- .class_size = sizeof(AspeedSoCClass),
181
+ /* FSI */
48
+static const TypeInfo aspeed_soc_ast2600_types[] = {
182
+ for (i = 0; i < ASPEED_FSI_NUM; i++) {
49
+ {
183
+ if (!sysbus_realize(SYS_BUS_DEVICE(&s->fsi[i]), errp)) {
50
+ .name = TYPE_ASPEED2600_SOC,
184
+ return;
51
+ .parent = TYPE_ASPEED_SOC,
185
+ }
52
+ .instance_size = sizeof(Aspeed2600SoCState),
186
+ aspeed_mmio_map(s, SYS_BUS_DEVICE(&s->fsi[i]), 0,
53
+ .abstract = true,
187
+ sc->memmap[ASPEED_DEV_FSI1 + i]);
54
+ }, {
188
+ sysbus_connect_irq(SYS_BUS_DEVICE(&s->fsi[i]), 0,
55
+ .name = "ast2600-a3",
189
+ aspeed_soc_get_irq(s, ASPEED_DEV_FSI1 + i));
56
+ .parent = TYPE_ASPEED2600_SOC,
190
+ }
57
+ .instance_init = aspeed_soc_ast2600_init,
191
}
58
+ .class_init = aspeed_soc_ast2600_class_init,
192
59
+ },
193
static void aspeed_soc_ast2600_class_init(ObjectClass *oc, void *data)
60
};
61
62
-static void aspeed_soc_register_types(void)
63
-{
64
- type_register_static(&aspeed_soc_ast2600_type_info);
65
-};
66
-
67
-type_init(aspeed_soc_register_types)
68
+DEFINE_TYPES(aspeed_soc_ast2600_types)
69
--
194
--
70
2.41.0
195
2.43.0
71
196
72
197
diff view generated by jsdifflib
New patch
1
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
3
Added basic qtests for FSI model.
4
5
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
6
Acked-by: Thomas Huth <thuth@redhat.com>
7
[ clg: aspeed-fsi-test.c -> aspeed_fsi-test.c to match other filenames ]
8
Signed-off-by: Cédric Le Goater <clg@kaod.org>
9
---
10
tests/qtest/aspeed_fsi-test.c | 205 ++++++++++++++++++++++++++++++++++
11
tests/qtest/meson.build | 1 +
12
2 files changed, 206 insertions(+)
13
create mode 100644 tests/qtest/aspeed_fsi-test.c
14
15
diff --git a/tests/qtest/aspeed_fsi-test.c b/tests/qtest/aspeed_fsi-test.c
16
new file mode 100644
17
index XXXXXXX..XXXXXXX
18
--- /dev/null
19
+++ b/tests/qtest/aspeed_fsi-test.c
20
@@ -XXX,XX +XXX,XX @@
21
+/*
22
+ * QTest testcases for IBM's Flexible Service Interface (FSI)
23
+ *
24
+ * Copyright (c) 2023 IBM Corporation
25
+ *
26
+ * Authors:
27
+ * Ninad Palsule <ninad@linux.ibm.com>
28
+ *
29
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
30
+ * See the COPYING file in the top-level directory.
31
+ */
32
+
33
+#include "qemu/osdep.h"
34
+#include <glib/gstdio.h>
35
+
36
+#include "qemu/module.h"
37
+#include "libqtest-single.h"
38
+
39
+/* Registers from ast2600 specifications */
40
+#define ASPEED_FSI_ENGINER_TRIGGER 0x04
41
+#define ASPEED_FSI_OPB0_BUS_SELECT 0x10
42
+#define ASPEED_FSI_OPB1_BUS_SELECT 0x28
43
+#define ASPEED_FSI_OPB0_RW_DIRECTION 0x14
44
+#define ASPEED_FSI_OPB1_RW_DIRECTION 0x2c
45
+#define ASPEED_FSI_OPB0_XFER_SIZE 0x18
46
+#define ASPEED_FSI_OPB1_XFER_SIZE 0x30
47
+#define ASPEED_FSI_OPB0_BUS_ADDR 0x1c
48
+#define ASPEED_FSI_OPB1_BUS_ADDR 0x34
49
+#define ASPEED_FSI_INTRRUPT_CLEAR 0x40
50
+#define ASPEED_FSI_INTRRUPT_STATUS 0x48
51
+#define ASPEED_FSI_OPB0_BUS_STATUS 0x80
52
+#define ASPEED_FSI_OPB1_BUS_STATUS 0x8c
53
+#define ASPEED_FSI_OPB0_READ_DATA 0x84
54
+#define ASPEED_FSI_OPB1_READ_DATA 0x90
55
+
56
+/*
57
+ * FSI Base addresses from the ast2600 specifications.
58
+ */
59
+#define AST2600_OPB_FSI0_BASE_ADDR 0x1e79b000
60
+#define AST2600_OPB_FSI1_BASE_ADDR 0x1e79b100
61
+
62
+static uint32_t aspeed_fsi_base_addr;
63
+
64
+static uint32_t aspeed_fsi_readl(QTestState *s, uint32_t reg)
65
+{
66
+ return qtest_readl(s, aspeed_fsi_base_addr + reg);
67
+}
68
+
69
+static void aspeed_fsi_writel(QTestState *s, uint32_t reg, uint32_t val)
70
+{
71
+ qtest_writel(s, aspeed_fsi_base_addr + reg, val);
72
+}
73
+
74
+/* Setup base address and select register */
75
+static void test_fsi_setup(QTestState *s, uint32_t base_addr)
76
+{
77
+ uint32_t curval;
78
+
79
+ aspeed_fsi_base_addr = base_addr;
80
+
81
+ /* Set the base select register */
82
+ if (base_addr == AST2600_OPB_FSI0_BASE_ADDR) {
83
+ /* Unselect FSI1 */
84
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x0);
85
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT);
86
+ g_assert_cmpuint(curval, ==, 0x0);
87
+
88
+ /* Select FSI0 */
89
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x1);
90
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT);
91
+ g_assert_cmpuint(curval, ==, 0x1);
92
+ } else if (base_addr == AST2600_OPB_FSI1_BASE_ADDR) {
93
+ /* Unselect FSI0 */
94
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_SELECT, 0x0);
95
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_SELECT);
96
+ g_assert_cmpuint(curval, ==, 0x0);
97
+
98
+ /* Select FSI1 */
99
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_SELECT, 0x1);
100
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_SELECT);
101
+ g_assert_cmpuint(curval, ==, 0x1);
102
+ } else {
103
+ g_assert_not_reached();
104
+ }
105
+}
106
+
107
+static void test_fsi_reg_change(QTestState *s, uint32_t reg, uint32_t newval)
108
+{
109
+ uint32_t base;
110
+ uint32_t curval;
111
+
112
+ base = aspeed_fsi_readl(s, reg);
113
+ aspeed_fsi_writel(s, reg, newval);
114
+ curval = aspeed_fsi_readl(s, reg);
115
+ g_assert_cmpuint(curval, ==, newval);
116
+ aspeed_fsi_writel(s, reg, base);
117
+ curval = aspeed_fsi_readl(s, reg);
118
+ g_assert_cmpuint(curval, ==, base);
119
+}
120
+
121
+static void test_fsi0_master_regs(const void *data)
122
+{
123
+ QTestState *s = (QTestState *)data;
124
+
125
+ test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR);
126
+
127
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0xF3F4F514);
128
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_XFER_SIZE, 0xF3F4F518);
129
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xF3F4F51c);
130
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540);
131
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548);
132
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_BUS_STATUS, 0xF3F4F580);
133
+ test_fsi_reg_change(s, ASPEED_FSI_OPB0_READ_DATA, 0xF3F4F584);
134
+}
135
+
136
+static void test_fsi1_master_regs(const void *data)
137
+{
138
+ QTestState *s = (QTestState *)data;
139
+
140
+ test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR);
141
+
142
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0xF3F4F514);
143
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_XFER_SIZE, 0xF3F4F518);
144
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xF3F4F51c);
145
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_CLEAR, 0xF3F4F540);
146
+ test_fsi_reg_change(s, ASPEED_FSI_INTRRUPT_STATUS, 0xF3F4F548);
147
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_BUS_STATUS, 0xF3F4F580);
148
+ test_fsi_reg_change(s, ASPEED_FSI_OPB1_READ_DATA, 0xF3F4F584);
149
+}
150
+
151
+static void test_fsi0_getcfam_addr0(const void *data)
152
+{
153
+ QTestState *s = (QTestState *)data;
154
+ uint32_t curval;
155
+
156
+ test_fsi_setup(s, AST2600_OPB_FSI0_BASE_ADDR);
157
+
158
+ /* Master access direction read */
159
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_RW_DIRECTION, 0x1);
160
+ /* word */
161
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_XFER_SIZE, 0x3);
162
+ /* Address */
163
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB0_BUS_ADDR, 0xa0000000);
164
+ aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1);
165
+ aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1);
166
+
167
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS);
168
+ g_assert_cmpuint(curval, ==, 0x10000);
169
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_BUS_STATUS);
170
+ g_assert_cmpuint(curval, ==, 0x0);
171
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB0_READ_DATA);
172
+ g_assert_cmpuint(curval, ==, 0x152d02c0);
173
+}
174
+
175
+static void test_fsi1_getcfam_addr0(const void *data)
176
+{
177
+ QTestState *s = (QTestState *)data;
178
+ uint32_t curval;
179
+
180
+ test_fsi_setup(s, AST2600_OPB_FSI1_BASE_ADDR);
181
+
182
+ /* Master access direction read */
183
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_RW_DIRECTION, 0x1);
184
+
185
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_XFER_SIZE, 0x3);
186
+ aspeed_fsi_writel(s, ASPEED_FSI_OPB1_BUS_ADDR, 0xa0000000);
187
+ aspeed_fsi_writel(s, ASPEED_FSI_INTRRUPT_CLEAR, 0x1);
188
+ aspeed_fsi_writel(s, ASPEED_FSI_ENGINER_TRIGGER, 0x1);
189
+
190
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_INTRRUPT_STATUS);
191
+ g_assert_cmpuint(curval, ==, 0x20000);
192
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_BUS_STATUS);
193
+ g_assert_cmpuint(curval, ==, 0x0);
194
+ curval = aspeed_fsi_readl(s, ASPEED_FSI_OPB1_READ_DATA);
195
+ g_assert_cmpuint(curval, ==, 0x152d02c0);
196
+}
197
+
198
+int main(int argc, char **argv)
199
+{
200
+ int ret = -1;
201
+ QTestState *s;
202
+
203
+ g_test_init(&argc, &argv, NULL);
204
+
205
+ s = qtest_init("-machine ast2600-evb ");
206
+
207
+ /* Tests for OPB/FSI0 */
208
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi0_master_regs", s,
209
+ test_fsi0_master_regs);
210
+
211
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi0_getcfam_addr0", s,
212
+ test_fsi0_getcfam_addr0);
213
+
214
+ /* Tests for OPB/FSI1 */
215
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi1_master_regs", s,
216
+ test_fsi1_master_regs);
217
+
218
+ qtest_add_data_func("/aspeed-fsi-test/test_fsi1_getcfam_addr0", s,
219
+ test_fsi1_getcfam_addr0);
220
+
221
+ ret = g_test_run();
222
+ qtest_quit(s);
223
+
224
+ return ret;
225
+}
226
diff --git a/tests/qtest/meson.build b/tests/qtest/meson.build
227
index XXXXXXX..XXXXXXX 100644
228
--- a/tests/qtest/meson.build
229
+++ b/tests/qtest/meson.build
230
@@ -XXX,XX +XXX,XX @@ qtests_arm = \
231
(config_all_devices.has_key('CONFIG_VEXPRESS') ? ['test-arm-mptimer'] : []) + \
232
(config_all_devices.has_key('CONFIG_MICROBIT') ? ['microbit-test'] : []) + \
233
(config_all_devices.has_key('CONFIG_STM32L4X5_SOC') ? qtests_stm32l4x5 : []) + \
234
+ (config_all_devices.has_key('CONFIG_FSI_APB2OPB_ASPEED') ? ['aspeed_fsi-test'] : []) + \
235
['arm-cpu-features',
236
'boot-serial-test']
237
238
--
239
2.43.0
240
241
diff view generated by jsdifflib
New patch
1
From: Ninad Palsule <ninad@linux.ibm.com>
1
2
3
Documentation for IBM FSI model.
4
5
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
[ clg : - Removed source file list
8
- Fixed aspeed machine reference ]
9
Signed-off-by: Cédric Le Goater <clg@kaod.org>
10
---
11
docs/specs/fsi.rst | 122 +++++++++++++++++++++++++++++++++++++++++++
12
docs/specs/index.rst | 1 +
13
2 files changed, 123 insertions(+)
14
create mode 100644 docs/specs/fsi.rst
15
16
diff --git a/docs/specs/fsi.rst b/docs/specs/fsi.rst
17
new file mode 100644
18
index XXXXXXX..XXXXXXX
19
--- /dev/null
20
+++ b/docs/specs/fsi.rst
21
@@ -XXX,XX +XXX,XX @@
22
+======================================
23
+IBM's Flexible Service Interface (FSI)
24
+======================================
25
+
26
+The QEMU FSI emulation implements hardware interfaces between ASPEED SOC, FSI
27
+master/slave and the end engine.
28
+
29
+FSI is a point-to-point two wire interface which is capable of supporting
30
+distances of up to 4 meters. FSI interfaces have been used successfully for
31
+many years in IBM servers to attach IBM Flexible Support Processors(FSP) to
32
+CPUs and IBM ASICs.
33
+
34
+FSI allows a service processor access to the internal buses of a host POWER
35
+processor to perform configuration or debugging. FSI has long existed in POWER
36
+processes and so comes with some baggage, including how it has been integrated
37
+into the ASPEED SoC.
38
+
39
+Working backwards from the POWER processor, the fundamental pieces of interest
40
+for the implementation are: (see the `FSI specification`_ for more details)
41
+
42
+1. The Common FRU Access Macro (CFAM), an address space containing various
43
+ "engines" that drive accesses on buses internal and external to the POWER
44
+ chip. Examples include the SBEFIFO and I2C masters. The engines hang off of
45
+ an internal Local Bus (LBUS) which is described by the CFAM configuration
46
+ block.
47
+
48
+2. The FSI slave: The slave is the terminal point of the FSI bus for FSI
49
+ symbols addressed to it. Slaves can be cascaded off of one another. The
50
+ slave's configuration registers appear in address space of the CFAM to
51
+ which it is attached.
52
+
53
+3. The FSI master: A controller in the platform service processor (e.g. BMC)
54
+ driving CFAM engine accesses into the POWER chip. At the hardware level
55
+ FSI is a bit-based protocol supporting synchronous and DMA-driven accesses
56
+ of engines in a CFAM.
57
+
58
+4. The On-Chip Peripheral Bus (OPB): A low-speed bus typically found in POWER
59
+ processors. This now makes an appearance in the ASPEED SoC due to tight
60
+ integration of the FSI master IP with the OPB, mainly the existence of an
61
+ MMIO-mapping of the CFAM address straight onto a sub-region of the OPB
62
+ address space.
63
+
64
+5. An APB-to-OPB bridge enabling access to the OPB from the ARM core in the
65
+ AST2600. Hardware limitations prevent the OPB from being directly mapped
66
+ into APB, so all accesses are indirect through the bridge.
67
+
68
+The LBUS is modelled to maintain the qdev bus hierarchy and to take advantages
69
+of the object model to automatically generate the CFAM configuration block.
70
+The configuration block presents engines in the order they are attached to the
71
+CFAM's LBUS. Engine implementations should subclass the LBusDevice and set the
72
+'config' member of LBusDeviceClass to match the engine's type.
73
+
74
+CFAM designs offer a lot of flexibility, for instance it is possible for a
75
+CFAM to be simultaneously driven from multiple FSI links. The modeling is not
76
+so complete; it's assumed that each CFAM is attached to a single FSI slave (as
77
+a consequence the CFAM subclasses the FSI slave).
78
+
79
+As for FSI, its symbols and wire-protocol are not modelled at all. This is not
80
+necessary to get FSI off the ground thanks to the mapping of the CFAM address
81
+space onto the OPB address space - the models follow this directly and map the
82
+CFAM memory region into the OPB's memory region.
83
+
84
+The following commands start the ``rainier-bmc`` machine with built-in FSI
85
+model. There are no model specific arguments. Please check this document to
86
+learn more about Aspeed ``rainier-bmc`` machine: (:doc:`../../system/arm/aspeed`)
87
+
88
+.. code-block:: console
89
+
90
+ qemu-system-arm -M rainier-bmc -nographic \
91
+ -kernel fitImage-linux.bin \
92
+ -dtb aspeed-bmc-ibm-rainier.dtb \
93
+ -initrd obmc-phosphor-initramfs.rootfs.cpio.xz \
94
+ -drive file=obmc-phosphor-image.rootfs.wic.qcow2,if=sd,index=2 \
95
+ -append "rootwait console=ttyS4,115200n8 root=PARTLABEL=rofs-a"
96
+
97
+The implementation appears as following in the qemu device tree:
98
+
99
+.. code-block:: console
100
+
101
+ (qemu) info qtree
102
+ bus: main-system-bus
103
+ type System
104
+ ...
105
+ dev: aspeed.apb2opb, id ""
106
+ gpio-out "sysbus-irq" 1
107
+ mmio 000000001e79b000/0000000000001000
108
+ bus: opb.1
109
+ type opb
110
+ dev: fsi.master, id ""
111
+ bus: fsi.bus.1
112
+ type fsi.bus
113
+ dev: cfam.config, id ""
114
+ dev: cfam, id ""
115
+ bus: lbus.1
116
+ type lbus
117
+ dev: scratchpad, id ""
118
+ address = 0 (0x0)
119
+ bus: opb.0
120
+ type opb
121
+ dev: fsi.master, id ""
122
+ bus: fsi.bus.0
123
+ type fsi.bus
124
+ dev: cfam.config, id ""
125
+ dev: cfam, id ""
126
+ bus: lbus.0
127
+ type lbus
128
+ dev: scratchpad, id ""
129
+ address = 0 (0x0)
130
+
131
+pdbg is a simple application to allow debugging of the host POWER processors
132
+from the BMC. (see the `pdbg source repository`_ for more details)
133
+
134
+.. code-block:: console
135
+
136
+ root@p10bmc:~# pdbg -a getcfam 0x0
137
+ p0: 0x0 = 0xc0022d15
138
+
139
+.. _FSI specification:
140
+ https://openpowerfoundation.org/specifications/fsi/
141
+
142
+.. _pdbg source repository:
143
+ https://github.com/open-power/pdbg
144
diff --git a/docs/specs/index.rst b/docs/specs/index.rst
145
index XXXXXXX..XXXXXXX 100644
146
--- a/docs/specs/index.rst
147
+++ b/docs/specs/index.rst
148
@@ -XXX,XX +XXX,XX @@ guest hardware that is specific to QEMU.
149
acpi_erst
150
sev-guest-firmware
151
fw_cfg
152
+ fsi
153
vmw_pvscsi-spec
154
edu
155
ivshmem-spec
156
--
157
2.43.0
158
159
diff view generated by jsdifflib
1
From: Andrew Jeffery <andrew@codeconstruct.com.au>
1
From: Ninad Palsule <ninad@linux.ibm.com>
2
2
3
I've changed employers, have company email that deals with patch-based
3
Add maintainer for IBM FSI model
4
workflows without too much of a headache, and am trying to steer some
5
content out of my personal mail.
6
4
7
Signed-off-by: Andrew Jeffery <andrew@codeconstruct.com.au>
5
Signed-off-by: Ninad Palsule <ninad@linux.ibm.com>
6
Reviewed-by: Cédric Le Goater <clg@kaod.org>
7
[ clg: - slight change in commit log
8
- fixed file list ]
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
MAINTAINERS | 2 +-
11
MAINTAINERS | 9 +++++++++
11
1 file changed, 1 insertion(+), 1 deletion(-)
12
1 file changed, 9 insertions(+)
12
13
13
diff --git a/MAINTAINERS b/MAINTAINERS
14
diff --git a/MAINTAINERS b/MAINTAINERS
14
index XXXXXXX..XXXXXXX 100644
15
index XXXXXXX..XXXXXXX 100644
15
--- a/MAINTAINERS
16
--- a/MAINTAINERS
16
+++ b/MAINTAINERS
17
+++ b/MAINTAINERS
17
@@ -XXX,XX +XXX,XX @@ F: docs/system/arm/emcraft-sf2.rst
18
@@ -XXX,XX +XXX,XX @@ F: tests/qtest/adm1272-test.c
18
ASPEED BMCs
19
F: tests/qtest/max34451-test.c
19
M: Cédric Le Goater <clg@kaod.org>
20
F: tests/qtest/isl_pmbus_vr-test.c
20
M: Peter Maydell <peter.maydell@linaro.org>
21
21
-R: Andrew Jeffery <andrew@aj.id.au>
22
+FSI
22
+R: Andrew Jeffery <andrew@codeconstruct.com.au>
23
+M: Ninad Palsule <ninad@linux.ibm.com>
23
R: Joel Stanley <joel@jms.id.au>
24
+R: Cédric Le Goater <clg@kaod.org>
24
L: qemu-arm@nongnu.org
25
+S: Maintained
25
S: Maintained
26
+F: hw/fsi/*
27
+F: include/hw/fsi/*
28
+F: docs/specs/fsi.rst
29
+F: tests/qtest/aspeed_fsi-test.c
30
+
31
Firmware schema specifications
32
M: Philippe Mathieu-Daudé <philmd@linaro.org>
33
R: Daniel P. Berrange <berrange@redhat.com>
26
--
34
--
27
2.41.0
35
2.43.0
28
36
29
37
diff view generated by jsdifflib