Hello Jamin, On 8/19/25 11:01, Jamin Lin wrote:
v1: 1. Add PCIe PHY, CFG, and MMIO window support for AST2600. Note: Only supports RC_H. 2. Add PCIe PHY, CFG, and MMIO window support for AST2700. Note: Supports 3 RCs.Testing PCIe RC model with e1000e PCIe device model AST2600 The AST2600/ASPEED PCIe driver treats root bus 0x80 specially: Only two device addresses are usable on the root bus: addr 0: ASPEED host bridge addr 8: usable for attaching a PCIe root port To attach endpoints without driver changes, the test places a QEMU PCIe root port at 0x80:08.0 and attaches an e1000e NIC behind it. The endpoint then enumerates on bus 0x81. QEMU command line additions -device pcie-root-port,id=root_port0,slot=1,addr=8,bus=pcie.0 -device e1000e,netdev=net0,bus=root_port0 -netdev user,id=net0 Verification with lspci: 0001:80:00.0 Host bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge 0001:80:08.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port 0001:81:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection This is a temporary solution that allows attaching multiple PCIe devices while the ASPEED drivers does not support placing endpoints directly on bus numbers 0x80.
Could we try to model the real HW topology ? On an ast2600a3 EVB with a PCI serial adapter plugged in the available slot : root@ast2600-default:~# lspci 80:00.0 Host bridge: ASPEED Technology, Inc. Device 2600 80:08.0 PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 06) 81:00.0 Serial controller: MosChip Semiconductor Technology Ltd. MCS9922 PCIe Multi-I/O Controller 81:00.1 Serial controller: MosChip Semiconductor Technology Ltd. MCS9922 PCIe Multi-I/O Controller What is blocking us from modeling "Device 2600" ? Thanks, C.
Reference: https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v6.6/drivers/pci/controller/pcie-aspeed.c#L309 Test Image: ASPEED SDK v09.07. It okay to use ASPEED SDK v09.06. https://github.com/AspeedTech-BMC/openbmc/releases/download/v09.07/ast2600-default-obmc.tar.gz The e1000e driver is built into this image. After booting, users should see the e1000e Ethernet interface. With this setup, RC_H on AST2600 can be tested using e1000e endpoints in QEMU. Example system output: root@ast2600-default:~# lspci 80:00.0 Host bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge 80:08.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port 81:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection root@ast2600-default:~# ifconfig eth4 eth4 Link encap:Ethernet HWaddr 52:54:00:12:34:5A inet addr:169.254.160.167 Bcast:169.254.255.255 Mask:255.255.0.0 inet6 addr: fe80::5054:ff:fe12:345a/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19 errors:0 dropped:0 overruns:0 frame:0 TX packets:54 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4896 (4.7 KiB) TX bytes:8079 (7.8 KiB) Interrupt:81 Memory:70040000-70060000 root@ast2600-default:~# dmesg | grep "e1000e" [ 2.901955] e1000e: Intel(R) PRO/1000 Network Driver [ 2.902346] e1000e: Copyright(c) 1999 - 2015 Intel Corporation. [ 15.366727] e1000e 0000:81:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 15.431884] e1000e 0000:81:00.0 0000:81:00.0 (uninitialized): registered PHC clock [ 15.508477] e1000e 0000:81:00.0 eth4: (PCI Express:2.5GT/s:Width x1) 52:54:00:12:34:5a [ 15.509301] e1000e 0000:81:00.0 eth4: Intel(R) PRO/1000 Network Connection [ 15.510768] e1000e 0000:81:00.0 eth4: MAC: 3, PHY: 8, PBA No: 000000-000 [ 49.781217] e1000e 0000:81:00.0 eth4: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx AST2700: The ASPEED PCIe driver only supports bus 0 with a single device at slot 0, which is reserved for the internal bridge. All endpoint devices must therefore reside on bus 1 to be discovered. See the ASPEED PCIe driver implementation here: https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v6.6/drivers/pci/controller/pcie-aspeed.c#L512 By default, the ASPEED SDK enables only PCIe RC2, so initial testing covers RC2 only. To attach e1000e devices and test all three RCs, I created a new test image with driver modifications. This is a temporary solution. A better approach is still needed to allow placing e1000e directly under bus 1. Test release: https://github.com/jamin-aspeed/openbmc/releases/tag/qemu-test-0907 Image download: https://github.com/jamin-aspeed/openbmc/releases/download/qemu-test-0907/ast2700-default-pcie-qemu.tar.xz This image includes the following changes: Kernel patch (AST2700 RC mode + PCIe driver updates): https://github.com/jamin-aspeed/openbmc/releases/download/qemu-test-0907/0001-PCI-aspeed-Enable-AST2700-RC-mode-support-and-adjust.patch OpenBMC patch (installs e1000e modules into rootfs for testing): https://github.com/jamin-aspeed/openbmc/releases/download/qemu-test-0907/0001-packagegroup-aspeed-Add-Intel-e1000-e1000e-kernel-mo.patch QEMU Test Command Each PCIe RC bus adds a pcie-root-port with an e1000e NIC behind it: -device pcie-root-port,id=root_port0,multifunction=on,slot=0,addr=1,bus=pcie.0 \ -device e1000e,netdev=net0,bus=root_port0 \ -netdev user,id=net0,hostfwd=:127.0.0.1:3222-:22,hostname=qemu0 \ -device pcie-root-port,id=root_port1,slot=1,addr=2,bus=pcie.1 \ -device e1000e,netdev=net1,bus=root_port1 \ -netdev user,id=net1,hostfwd=:127.0.0.1:4222-:22,hostname=qemu1 \ -device pcie-root-port,id=root_port2,slot=2,addr=3,bus=pcie.2 \ -device e1000e,netdev=net2,bus=root_port2 \ -netdev user,id=net2,hostfwd=:127.0.0.1:5222-:22,hostname=qemu2 \ Expected Results With lspci, each RC should show the internal bridge, root port, and e1000e endpoint: root@ast2700-default:~# lspci 0000:00:00.0 Host bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge 0000:00:01.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port 0000:01:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection 0001:00:00.0 Host bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge 0001:00:02.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port 0001:01:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection 0002:00:00.0 Host bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge 0002:00:03.0 PCI bridge: Red Hat, Inc. QEMU PCIe Root port 0002:01:00.0 Ethernet controller: Intel Corporation 82574L Gigabit Network Connection Load the e1000e driver: Kernel logs confirm device initialization and link-up at 1 Gbps Full Duplex on eth2/eth3/eth4. root@ast2700-default:~# modprobe e1000e [ 59.181623] e1000e: Intel(R) PRO/1000 Network Driver [ 59.181926] e1000e: Copyright(c) 1999 - 2015 Intel Corporation. [ 59.183508] e1000e 0000:01:00.0: enabling device (0000 -> 0002) [ 59.188808] e1000e 0000:01:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 59.252590] e1000e 0000:01:00.0 0000:01:00.0 (uninitialized): registered PHC clock [ 59.330877] e1000e 0000:01:00.0 eth2: (PCI Express:2.5GT/s:Width x1) 52:54:00:12:34:56 [ 59.331990] e1000e 0000:01:00.0 eth2: Intel(R) PRO/1000 Network Connection [ 59.333211] e1000e 0000:01:00.0 eth2: MAC: 3, PHY: 8, PBA No: 000000-000 [ 59.334881] e1000e 0001:01:00.0: enabling device (0000 -> 0002) [ 59.341616] e1000e 0001:01:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 59.394712] e1000e 0001:01:00.0 0001:01:00.0 (uninitialized): registered PHC clock [ 59.456674] e1000e 0001:01:00.0 eth3: (PCI Express:2.5GT/s:Width x1) 52:54:00:12:34:57 [ 59.457487] e1000e 0001:01:00.0 eth3: Intel(R) PRO/1000 Network Connection [ 59.458033] e1000e 0001:01:00.0 eth3: MAC: 3, PHY: 8, PBA No: 000000-000 [ 59.460037] e1000e 0002:01:00.0: enabling device (0000 -> 0002) [ 59.466403] e1000e 0002:01:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode [ 59.533361] e1000e 0002:01:00.0 0002:01:00.0 (uninitialized): registered PHC clock [ 59.654491] 8021q: adding VLAN 0 to HW filter on device eth2 [ 59.662100] e1000e 0002:01:00.0 eth4: (PCI Express:2.5GT/s:Width x1) 52:54:00:12:34:58 [ 59.662966] e1000e 0002:01:00.0 eth4: Intel(R) PRO/1000 Network Connection [ 59.663527] e1000e 0002:01:00.0 eth4: MAC: 3, PHY: 8, PBA No: 000000-000 root@ast2700-default:~# [ 59.814984] 8021q: adding VLAN 0 to HW filter on device eth3 [ 59.938859] 8021q: adding VLAN 0 to HW filter on device eth4 [ 59.954690] e1000e 0000:01:00.0 eth2: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx [ 60.116790] e1000e 0001:01:00.0 eth3: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx [ 60.237622] e1000e 0002:01:00.0 eth4: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx After loading, users should see: eth2: PCIe0 eth3: PCIe1 eth4: PCIe2 Example ifconfig output shows all interfaces (eth0-eth4) active, with eth2-eth4 bound to the e1000e NICs. With this setup, all three PCIe RCs on AST2700 can be tested using e1000e endpoints in QEMU. root@ast2700-default:~# ifconfig eth2 Link encap:Ethernet HWaddr 52:54:00:12:34:56 inet addr:169.254.120.135 Bcast:169.254.255.255 Mask:255.255.0.0 inet6 addr: fe80::5054:ff:fe12:3456/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19 errors:0 dropped:0 overruns:0 frame:0 TX packets:51 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:5227 (5.1 KiB) TX bytes:8551 (8.3 KiB) Interrupt:42 Memory:60040000-60060000 eth3 Link encap:Ethernet HWaddr 52:54:00:12:34:57 inet addr:169.254.237.52 Bcast:169.254.255.255 Mask:255.255.0.0 inet6 addr: fe80::5054:ff:fe12:3457/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:47 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4786 (4.6 KiB) TX bytes:8175 (7.9 KiB) Interrupt:45 Memory:80040000-80060000 eth4 Link encap:Ethernet HWaddr 52:54:00:12:34:58 inet addr:169.254.84.173 Bcast:169.254.255.255 Mask:255.255.0.0 inet6 addr: fe80::5054:ff:fe12:3458/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:16 errors:0 dropped:0 overruns:0 frame:0 TX packets:47 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4786 (4.6 KiB) TX bytes:8191 (7.9 KiB) Interrupt:48 Memory:a0040000-a0060000 Jamin Lin (11): hw/pci/pci_ids Add PCI vendor ID for ASPEED hw/pci-host/aspeed: Add AST2600 PCIe PHY model hw/pci-host/aspeed: Add AST2600 PCIe config and host bridge hw/pci-host/aspeed: Add MSI support and per-RC IOMMU address space hw/arm/aspeed: Wire up PCIe devices in SoC model hw/arm/aspeed_ast2600: Add PCIe RC support (RC_H only) tests/functional/test_arm_aspeed_ast2600: Add PCIe test via root port and e1000e hw/pci-host/aspeed: Add AST2700 PCIe PHY hw/pci-host/aspeed: Add AST2700 PCIe config with dedicated H2X blocks hw/arm/aspeed_ast27x0: Introduce 3 PCIe RCs for AST2700 tests/functional: Add PCIe presence test for AST2700 include/hw/arm/aspeed_soc.h | 14 + include/hw/pci-host/aspeed_pcie.h | 125 +++ include/hw/pci/pci_ids.h | 2 + hw/arm/aspeed_ast2600.c | 69 +- hw/arm/aspeed_ast27x0.c | 61 ++ hw/pci-host/aspeed_pcie.c | 955 ++++++++++++++++++ hw/arm/Kconfig | 3 + hw/pci-host/Kconfig | 4 + hw/pci-host/meson.build | 1 + hw/pci-host/trace-events | 11 + .../functional/test_aarch64_aspeed_ast2700.py | 7 + .../test_aarch64_aspeed_ast2700fc.py | 6 + tests/functional/test_arm_aspeed_ast2600.py | 14 + 13 files changed, 1269 insertions(+), 3 deletions(-) create mode 100644 include/hw/pci-host/aspeed_pcie.h create mode 100644 hw/pci-host/aspeed_pcie.c
