RE: [SPAM] [PATCH v1 00/11] Support PCIe RC to AST2600 and AST2700

Jamin Lin posted 11 patches 4 days, 12 hours ago
Only 0 patches received!
There is a newer version of this series
RE: [SPAM] [PATCH v1 00/11] Support PCIe RC to AST2600 and AST2700
Posted by Jamin Lin 4 days, 12 hours ago
Hi Cédric

> Subject: Re: [SPAM] [PATCH v1 00/11] Support PCIe RC to AST2600 and
> AST2700
> 
> 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" ?
> 
On real hardware, the AST2600 EVB shows two functions on bus 0x80:

0001:80:08.0 – AST1150 PCI-to-PCI Bridge
PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 06)
Subsystem: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge
Flags: bus master, fast devsel, latency 0, IRQ 81
Bus: primary=80, secondary=81, subordinate=82
I/O behind bridge: 1000-1fff [size=4K] [16-bit]
Memory behind bridge: 70000000-75ffffff [size=96M] [32-bit]
Prefetchable memory behind bridge: [disabled] [64-bit]
Capabilities: MSI, Power Management v3, Express Root Port, Virtual Channel, AER
Kernel driver in use: pcieport

0001:80:00.0 – Host bridge (Device 2600)
Host bridge: ASPEED Technology, Inc. Device 2600
Subsystem: ASPEED Technology, Inc. Device 2600
Flags: bus master, fast devsel, latency 0

In contrast, on the AST2700 platform the enumeration starts directly at bus 0 with the AST1150 bridge, and no separate “Device 2700” host bridge is visible:

0002:00:00.0 – AST1150 PCI-to-PCI Bridge
PCI bridge: ASPEED Technology, Inc. AST1150 PCI-to-PCI Bridge (rev 10)
Flags: bus master, fast devsel, latency 0, IRQ 43
Bus: primary=00, secondary=01, subordinate=01
I/O behind bridge: [disabled]
Memory behind bridge: [disabled]
Prefetchable memory behind bridge: [disabled]
Capabilities: Express Root Port, MSI, Power Management v3,
              Vendor Specific Information, L1 PM Substates, AER
Kernel driver in use: pcieport


What blocks me from modeling “Device 2600” today is mainly the "lack of a proper QEMU device model for the AST2600/AST2700 PCIe Host bridge".
On AST2600, 80:00.0 is the host bridge and 80:08.0 is the downstream AST1150 bridge. To reproduce this topology in QEMU, we would need to:

1. Implement a new QEMU device for the AST2600/AST2700 host bridge, with its own PCI config space and initialization.
2. Integrate this model with the ASPEED PCIe driver, which currently only supports endpoints appearing behind a bridge on bus 0x81 for AST2600 and 0x01 for AST2700, and does not allow attaching devices directly
under bus 0x80 for AST2600 and 0x00 for AST2700.

"Until such a host bridge model is introduced, the temporary workaround is to insert a generic QEMU pcie-root-port at 0x80:08.0." This allows endpoints to enumerate correctly, but it does not exactly match the EVB topology.
Adding a dedicated AST2600 host bridge model is the next step if we want QEMU to reflect the hardware layout more faithfully, while keeping the AST2700 behavior (00:00.0 only) consistent.

Thanks-Jamin
> 
> Thanks,
> 
> C.
> 
> 
> 
> 
> 
> > Reference:
> > https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v6.6/driver
> > s/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/ast
> > 2600-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/driver
> > s/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-09
> > 07/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-09
> > 07/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-09
> > 07/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
> >