qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Cédric Le Goater" <clg@kaod.org>
To: Jamin Lin <jamin_lin@aspeedtech.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Steven Lee <steven_lee@aspeedtech.com>,
	Troy Lee <leetroy@gmail.com>,
	Andrew Jeffery <andrew@codeconstruct.com.au>,
	Joel Stanley <joel@jms.id.au>,
	"Michael S. Tsirkin" <mst@redhat.com>,
	Marcel Apfelbaum <marcel.apfelbaum@gmail.com>,
	"open list:ARM TCG CPUs" <qemu-arm@nongnu.org>,
	"open list:All patches CC here" <qemu-devel@nongnu.org>
Cc: Troy Lee <troy_lee@aspeedtech.com>,
	"nabihestefan@google.com" <nabihestefan@google.com>,
	"wuhaotsh@google.com" <wuhaotsh@google.com>,
	"titusr@google.com" <titusr@google.com>
Subject: Re: [SPAM] [PATCH v2 03/14] hw/pci-host/aspeed: Add AST2600 PCIe config space and host bridge
Date: Wed, 17 Sep 2025 12:21:19 +0200	[thread overview]
Message-ID: <843f49ae-f5b0-4033-be7c-d876d23043a5@kaod.org> (raw)
In-Reply-To: <SI2PR06MB5041E61144152D33F53CED95FC17A@SI2PR06MB5041.apcprd06.prod.outlook.com>

On 9/17/25 11:05, Jamin Lin wrote:
> Hi Cédric
> 
>> Subject: RE: [SPAM] [PATCH v2 03/14] hw/pci-host/aspeed: Add AST2600 PCIe
>> config space and host bridge
>>
>> Hi Cédric
>>
>>> Subject: Re: [SPAM] [PATCH v2 03/14] hw/pci-host/aspeed: Add AST2600
>>> PCIe config space and host bridge
>>>
>>> On 9/11/25 09:24, Jamin Lin wrote:
>>>> Introduce PCIe config and host bridge model for the AST2600 platform.
>>>>
>>>> This patch adds support for the H2X (AHB to PCIe Bus Bridge)
>>>> controller with a 0x100 byte register space. The register layout is
>>>> shared between two root complexes: 0x00–0x7f is common, 0x80–0xbf
>>>> for RC_L, and 0xc0–0xff for RC_H. Only RC_H is modeled in this
>>> implementation.
>>>>
>>>> The RC_H bus uses bus numbers in the 0x80–0xff range instead of the
>>>> standard root bus 0x00. To allow the PCI subsystem to discover
>>>> devices, the host bridge logic remaps the root bus number back to
>>>> 0x00 whenever the configured bus number matches the "bus-nr" property.
>>>>
>>>> New MMIO callbacks are added for the H2X config space:
>>>> - aspeed_pcie_cfg_read() and aspeed_pcie_cfg_write() handle register
>>>>     accesses.
>>>> - aspeed_pcie_cfg_readwrite() provides configuration read/write support.
>>>> - aspeed_pcie_cfg_translate_write() handles PCIe byte-enable semantics
>> for
>>>>     write operations.
>>>>
>>>> The reset handler initializes the H2X register block with default
>>>> values as defined in the AST2600 datasheet.
>>>>
>>>> Additional changes:
>>>> - Implement ASPEED PCIe root complex (TYPE_ASPEED_PCIE_RC).
>>>> - Wire up interrupt propagation via aspeed_pcie_rc_set_irq().
>>>> - Add tracepoints for config read/write and INTx handling.
>>>>
>>>> Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com>
>>>> ---
>>>>    include/hw/pci-host/aspeed_pcie.h |  58 ++++
>>>>    hw/pci-host/aspeed_pcie.c         | 422
>>> ++++++++++++++++++++++++++++++
>>>>    hw/pci-host/trace-events          |   4 +
>>>>    3 files changed, 484 insertions(+)
>>>>
>>>> diff --git a/include/hw/pci-host/aspeed_pcie.h
>>>> b/include/hw/pci-host/aspeed_pcie.h
>>>> index faf87073ab..e2c5dc6f62 100644
>>>> --- a/include/hw/pci-host/aspeed_pcie.h
>>>> +++ b/include/hw/pci-host/aspeed_pcie.h
>>>> @@ -24,6 +24,64 @@
>>>>    #include "hw/pci/pcie_host.h"
>>>>    #include "qom/object.h"
>>>>
>>>> +typedef struct AspeedPCIECfgTxDesc {
>>>> +    uint32_t desc0;
>>>> +    uint32_t desc1;
>>>> +    uint32_t desc2;
>>>> +    uint32_t desc3;
>>>> +    uint32_t wdata;
>>>> +    uint32_t rdata_reg;
>>>> +} AspeedPCIECfgTxDesc;
>>>> +
>>>> +typedef struct AspeedPCIERcRegs {
>>>> +    uint32_t int_en_reg;
>>>> +    uint32_t int_sts_reg;
>>>> +} AspeedPCIERcRegs;
>>>> +
>>>> +typedef struct AspeedPCIERegMap {
>>>> +    AspeedPCIERcRegs rc;
>>>> +} AspeedPCIERegMap;
>>>> +
>>>> +#define TYPE_ASPEED_PCIE_RC "aspeed.pcie-rc"
>>>> +OBJECT_DECLARE_SIMPLE_TYPE(AspeedPCIERcState, ASPEED_PCIE_RC);
>>>> +
>>>> +struct AspeedPCIERcState {
>>>> +    PCIExpressHost parent_obj;
>>>> +
>>>> +    MemoryRegion mmio_window;
>>>> +    MemoryRegion io_window;
>>>> +    MemoryRegion mmio;
>>>> +    MemoryRegion io;
>>>> +
>>>> +    uint32_t bus_nr;
>>>> +    char name[16];
>>>> +    qemu_irq irq;
>>>> +};
>>>> +
>>>> +/* Bridge between AHB bus and PCIe RC. */ #define
>>>> +TYPE_ASPEED_PCIE_CFG "aspeed.pcie-cfg"
>>>> +OBJECT_DECLARE_TYPE(AspeedPCIECfgState, AspeedPCIECfgClass,
>>>> +ASPEED_PCIE_CFG);
>>>> +
>>>> +struct AspeedPCIECfgState {
>>>> +    SysBusDevice parent_obj;
>>>> +
>>>> +    MemoryRegion mmio;
>>>> +    uint32_t *regs;
>>>> +    uint32_t id;
>>>> +
>>>> +    AspeedPCIERcState rc;
>>>> +};
>>>> +
>>>> +struct AspeedPCIECfgClass {
>>>> +    SysBusDeviceClass parent_class;
>>>> +
>>>> +    const AspeedPCIERegMap *reg_map;
>>>> +    const MemoryRegionOps *reg_ops;
>>>> +
>>>> +    uint64_t rc_bus_nr;
>>>> +    uint64_t nr_regs;
>>>> +};
>>>> +
>>>>    #define TYPE_ASPEED_PCIE_PHY "aspeed.pcie-phy"
>>>>    OBJECT_DECLARE_TYPE(AspeedPCIEPhyState, AspeedPCIEPhyClass,
>>>> ASPEED_PCIE_PHY);
>>>>
>>>> diff --git a/hw/pci-host/aspeed_pcie.c b/hw/pci-host/aspeed_pcie.c
>>>> index 5584449b17..9fb7c1ef67 100644
>>>> --- a/hw/pci-host/aspeed_pcie.c
>>>> +++ b/hw/pci-host/aspeed_pcie.c
>>>> @@ -27,6 +27,426 @@
>>>>    #include "hw/pci/msi.h"
>>>>    #include "trace.h"
>>>>
>>>> +/*
>>>> + * PCIe Root Complex (RC)
>>>> + */
>>>> +
>>>> +static void aspeed_pcie_rc_set_irq(void *opaque, int irq, int
>>>> +level) {
>>>> +    AspeedPCIERcState *rc = (AspeedPCIERcState *) opaque;
>>>> +    AspeedPCIECfgState *cfg =
>>>> +        container_of(rc, AspeedPCIECfgState, rc);
>>>> +    AspeedPCIECfgClass *apc = ASPEED_PCIE_CFG_GET_CLASS(cfg);
>>>> +    const AspeedPCIERcRegs *rc_regs;
>>>
>>> I suggest you cache &apc->reg_map->rc under AspeedPCIECfgState as an
>>> attribute (at realize time). This will ease reading the code and
>>> improve performance.
>>>
>> Thanks for your review and suggestion.
>> Will do.
>>
>>>> +    bool intx;
>>>> +
>>>> +    assert(irq < PCI_NUM_PINS);
>>>> +
>>>> +    rc_regs = &apc->reg_map->rc;
>>>> +
>>>> +    if (level) {
>>>> +        cfg->regs[rc_regs->int_sts_reg] |= BIT(irq);
>>>> +    } else {
>>>> +        cfg->regs[rc_regs->int_sts_reg] &= ~BIT(irq);
>>>> +    }
>>>> +
>>>> +    intx = !!(cfg->regs[rc_regs->int_sts_reg] &
>>> cfg->regs[rc_regs->int_en_reg]);
>>>> +    trace_aspeed_pcie_rc_intx_set_irq(cfg->id, irq, intx);
>>>> +    qemu_set_irq(rc->irq, intx);
>>>> +}
>>>> +
>>>> +static int aspeed_pcie_rc_map_irq(PCIDevice *pci_dev, int irq_num) {
>>>> +    return irq_num % PCI_NUM_PINS;
>>>> +}
>>>> +
>>>> +static void aspeed_pcie_rc_realize(DeviceState *dev, Error **errp) {
>>>> +    PCIExpressHost *pex = PCIE_HOST_BRIDGE(dev);
>>>> +    AspeedPCIERcState *rc = ASPEED_PCIE_RC(dev);
>>>> +    AspeedPCIECfgState *cfg =
>>>> +           container_of(rc, AspeedPCIECfgState, rc);
>>>> +    PCIHostState *pci = PCI_HOST_BRIDGE(dev);
>>>> +    SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
>>>> +    g_autofree char *name;
>>>> +
>>>> +    /* PCI configuration space */
>>>> +    pcie_host_mmcfg_init(pex, PCIE_MMCFG_SIZE_MAX);
>>>> +    sysbus_init_mmio(sbd, &pex->mmio);
>>>> +
>>>> +    /* MMIO and IO region */
>>>> +    memory_region_init(&rc->mmio, OBJECT(rc), "mmio",
>> UINT64_MAX);
>>>> +    memory_region_init(&rc->io, OBJECT(rc), "io", 0x10000);
>>>> +
>>>> +    name = g_strdup_printf("pcie.%d.mmio_window", cfg->id);
>>>> +    memory_region_init_io(&rc->mmio_window, OBJECT(rc),
>>> &unassigned_io_ops,
>>>> +                          OBJECT(rc), name, UINT64_MAX);
>>>> +    name = g_strdup_printf("pcie.%d.ioport_window", cfg->id);
>>>> +    memory_region_init_io(&rc->io_window, OBJECT(rc),
>>> &unassigned_io_ops,
>>>> +                          OBJECT(rc), name, 0x10000);
>>>> +
>>>> +    memory_region_add_subregion(&rc->mmio_window, 0,
>> &rc->mmio);
>>>> +    memory_region_add_subregion(&rc->io_window, 0, &rc->io);
>>>> +    sysbus_init_mmio(sbd, &rc->mmio_window);
>>>> +    sysbus_init_mmio(sbd, &rc->io_window);
>>>> +
>>>> +    sysbus_init_irq(sbd, &rc->irq);
>>>> +    name = g_strdup_printf("pcie.rc%d", cfg->id);
>>>> +    pci->bus = pci_register_root_bus(dev, name, aspeed_pcie_rc_set_irq,
>>>> +                                     aspeed_pcie_rc_map_irq,
>> rc,
>>> &rc->mmio,
>>>> +                                     &rc->io, 0, 4,
>>> TYPE_PCIE_BUS);
>>>> +    pci->bus->flags |= PCI_BUS_EXTENDED_CONFIG_SPACE; }
>>>> +
>>>> +static const char *aspeed_pcie_rc_root_bus_path(PCIHostState
>>> *host_bridge,
>>>> +                                                PCIBus
>> *rootbus)
>>> {
>>>> +    AspeedPCIERcState *rc = ASPEED_PCIE_RC(host_bridge);
>>>> +    AspeedPCIECfgState *cfg =
>>>> +           container_of(rc, AspeedPCIECfgState, rc);
>>>> +
>>>> +    snprintf(rc->name, sizeof(rc->name), "%04x:%02x", cfg->id,
>>>> + rc->bus_nr);
>>>> +
>>>> +    return rc->name;
>>>> +}
>>>> +
>>>> +static const Property aspeed_pcie_rc_props[] = {
>>>> +    DEFINE_PROP_UINT32("bus-nr", AspeedPCIERcState, bus_nr, 0), };
>>>> +
>>>> +static void aspeed_pcie_rc_class_init(ObjectClass *klass, const
>>>> +void
>>>> +*data) {
>>>> +    PCIHostBridgeClass *hc = PCI_HOST_BRIDGE_CLASS(klass);
>>>> +    DeviceClass *dc = DEVICE_CLASS(klass);
>>>> +
>>>> +    dc->desc = "ASPEED PCIe RC";
>>>> +    dc->realize = aspeed_pcie_rc_realize;
>>>> +    dc->fw_name = "pci";
>>>> +    set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
>>>> +
>>>> +    hc->root_bus_path = aspeed_pcie_rc_root_bus_path;
>>>> +    device_class_set_props(dc, aspeed_pcie_rc_props);
>>>> +
>>>> +    msi_nonbroken = true;
>>>> +}
>>>> +
>>>> +static const TypeInfo aspeed_pcie_rc_info = {
>>>> +    .name = TYPE_ASPEED_PCIE_RC,
>>>> +    .parent = TYPE_PCIE_HOST_BRIDGE,
>>>> +    .instance_size = sizeof(AspeedPCIERcState),
>>>> +    .class_init = aspeed_pcie_rc_class_init, };
>>>> +
>>>> +/*
>>>> + * PCIe Config
>>>> + *
>>>> + * AHB to PCIe Bus Bridge (H2X)
>>>> + *
>>>> + * On the AST2600:
>>>> + * NOTE: rc_l is not supported by this model.
>>>> + * - Registers 0x00 - 0x7F are shared by both PCIe0 (rc_l) and PCIe1 (rc_h).
>>>> + * - Registers 0x80 - 0xBF are specific to PCIe0.
>>>> + * - Registers 0xC0 - 0xFF are specific to PCIe1.
>>>> + */
>>>> +
>>>> +/* AST2600 */
>>>> +REG32(H2X_CTRL,             0x00)
>>>> +    FIELD(H2X_CTRL, CLEAR_RX, 4, 1)
>>>> +REG32(H2X_TX_CLEAR,         0x08)
>>>> +    FIELD(H2X_TX_CLEAR, IDLE, 0, 1)
>>>> +REG32(H2X_RDATA,            0x0C)
>>>> +REG32(H2X_TX_DESC0,         0x10)
>>>> +REG32(H2X_TX_DESC1,         0x14)
>>>> +REG32(H2X_TX_DESC2,         0x18)
>>>> +REG32(H2X_TX_DESC3,         0x1C)
>>>> +REG32(H2X_TX_DATA,          0x20)
>>>> +REG32(H2X_TX_STS,           0x24)
>>>> +    FIELD(H2X_TX_STS, IDLE, 31, 1)
>>>> +    FIELD(H2X_TX_STS, RC_L_TX_COMP, 24, 1)
>>>> +    FIELD(H2X_TX_STS, RC_H_TX_COMP, 25, 1)
>>>> +    FIELD(H2X_TX_STS, TRIG, 0, 1)
>>>> +REG32(H2X_RC_H_CTRL,        0xC0)
>>>> +REG32(H2X_RC_H_INT_EN,      0xC4)
>>>> +REG32(H2X_RC_H_INT_STS,     0xC8)
>>>> +    SHARED_FIELD(H2X_RC_INT_INTDONE, 4, 1)
>>>> +    SHARED_FIELD(H2X_RC_INT_INTX, 0, 4)
>>>> +REG32(H2X_RC_H_RDATA,       0xCC)
>>>> +
>>>> +#define TLP_FMTTYPE_CFGRD0  0x04 /* Configuration Read  Type 0 */
>>>> +#define TLP_FMTTYPE_CFGWR0  0x44 /* Configuration Write Type 0 */
>>>> +#define TLP_FMTTYPE_CFGRD1  0x05 /* Configuration Read  Type 1 */
>>>> +#define TLP_FMTTYPE_CFGWR1  0x45 /* Configuration Write Type 1 */
>>>> +
>>>> +#define PCIE_CFG_FMTTYPE_MASK(x) (((x) >> 24) & 0xff) #define
>>>> +PCIE_CFG_BYTE_EN(x) ((x) & 0xf)
>>>> +
>>>> +static const AspeedPCIERegMap aspeed_regmap = {
>>>> +    .rc = {
>>>> +        .int_en_reg     = R_H2X_RC_H_INT_EN,
>>>> +        .int_sts_reg    = R_H2X_RC_H_INT_STS,
>>>> +    },
>>>> +};
>>>> +
>>>> +static uint64_t aspeed_pcie_cfg_read(void *opaque, hwaddr addr,
>>>> +                                     unsigned int size) {
>>>> +    AspeedPCIECfgState *s = ASPEED_PCIE_CFG(opaque);
>>>> +    uint32_t reg = addr >> 2;
>>>> +    uint32_t value = 0;
>>>> +
>>>> +    value = s->regs[reg];
>>>> +
>>>> +    trace_aspeed_pcie_cfg_read(s->id, addr, value);
>>>> +
>>>> +    return value;
>>>> +}
>>>> +
>>>> +static void aspeed_pcie_cfg_translate_write(uint8_t byte_en,
>>>> +uint32_t
>>> *addr,
>>>> +                                            uint64_t *val, int
>>> *len)
>>>> +{
>>>> +    uint64_t packed_val = 0;
>>>> +    int first_bit = -1;
>>>> +    int index = 0;
>>>> +    int i;
>>>> +
>>>> +    *len = ctpop8(byte_en);
>>>> +
>>>> +    if (*len == 0 || *len > 4) {
>>>> +        goto err;
>>>> +    }
>>>> +
>>>> +    /* Special case: full 4-byte write must be 4-byte aligned */
>>>> +    if (byte_en == 0x0f) {
>>>> +        if (*addr % 4 != 0) {
>>>
>>> This is an aligment issue to be reported as such and not with "invalid
>>> byte enable"
>>>
>>> I think you should remove the "goto err" and generate a
>>> LOG_GUEST_ERROR instead.
>>>
>> Will fix it.
>>>> +            goto err;
>>>> +        }
>>>> +        *val = *val & 0xffffffff;
>>>> +        return;
>>>> +    }
>>>> +
>>>> +    for (i = 0; i < 4; i++) {
>>>> +        if (byte_en & (1 << i)) {
>>>> +            if (first_bit < 0) {
>>>> +                first_bit = i;
>>>> +            }
>>>> +            packed_val |= ((*val >> (i * 8)) & 0xff) << (index * 8);
>>>> +            index++;> +        }
>>>> +    }
>>>> +
>>>> +    *addr += first_bit;
>>>> +    *val = packed_val;
>>>> +
>>>> +    return;
>>>> +
>>>> +err:
>>>> +    qemu_log_mask(LOG_GUEST_ERROR, "%s: invalid byte enable:
>>> 0x%x\n",
>>>> +                  __func__, byte_en); }
>>>> +
>>>> +static void aspeed_pcie_cfg_readwrite(AspeedPCIECfgState *s,
>>>> +                                      const
>> AspeedPCIECfgTxDesc
>>>> +*desc) {
>>>> +    AspeedPCIERcState *rc = &s->rc;
>>>> +    PCIHostState *pci;
>>>> +    uint32_t cfg_addr;
>>>> +    PCIDevice *pdev;
>>>> +    uint32_t offset;
>>>> +    uint8_t byte_en;
>>>> +    bool is_write;
>>>> +    uint8_t devfn;
>>>> +    uint64_t val;
>>>> +    uint8_t bus;
>>>> +    int len;
>>>> +
>>>> +    val = ~0;
>>>> +    is_write = !!(desc->desc0 & BIT(30));
>>>> +    cfg_addr = desc->desc2;
>>>
>>>
>>> hmm, what about endianess ?
>>>
> 
> We keep .endianness = DEVICE_LITTLE_ENDIAN on the MMIO region, so the guest wire-LE bytes are already converted at the MMIO boundary.
> Inside the device (s->regs[], FIFOs, and desc.*) we consistently use CPU-endian integers and apply bitfield operations on those.
> 
> I tried adding explicit le32_to_cpu()/cpu_to_le32() on s->regs[] to “convert” them again to CPU-endian,
> but that caused a "double swap" on big-endian hosts (e.g. MIPS64). The result was broken config TLP decoding and incorrect byte-enable packing.
> 
> I experimented with the patch below—does this look incorrect given the MMIO endianness model?
> case R_H2X_TX_STS:
>      if (data & R_H2X_TX_STS_TRIG_MASK) {
> -       desc.desc0 = s->regs[R_H2X_TX_DESC0];
> -       desc.desc1 = s->regs[R_H2X_TX_DESC1];
> -       desc.desc2 = s->regs[R_H2X_TX_DESC2];
> -       desc.desc3 = s->regs[R_H2X_TX_DESC3];
> -       desc.wdata = s->regs[R_H2X_TX_DATA];
> +       desc.desc0 = le32_to_cpu(s->regs[R_H2X_TX_DESC0]);
> +       desc.desc1 = le32_to_cpu(s->regs[R_H2X_TX_DESC1]);
> +       desc.desc2 = le32_to_cpu(s->regs[R_H2X_TX_DESC2]);
> +       desc.desc3 = le32_to_cpu(s->regs[R_H2X_TX_DESC3]);
> +       desc.wdata = le32_to_cpu(s->regs[R_H2X_TX_DATA]);
>          desc.rdata_reg = R_H2X_RC_H_RDATA;
>          aspeed_pcie_cfg_readwrite(s, &desc);
>          ...
> 
> On MIPS64 (BE) this change made the device non-functional, which aligns with the double-swap hypothesis.
> My understanding is we should not add these conversions and instead keep s->regs[]/desc.* strictly CPU-endian, relying on the MMIO layer for wire-LE ↔ CPU conversions.
> 
> I tested the v2 patch series and it passes on a big-endian host machine (qemumips64)
> Does anything above look incorrect to you?

My bad. Conversions are no needed since the descriptors come from
register values, and not RAM :/

A e1000e device works find on a BE host :

10: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
     link/ether 52:54:00:12:34:59 brd ff:ff:ff:ff:ff:ff
     inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth4
        valid_lft 86279sec preferred_lft 86279sec
     inet6 fe80::5054:ff:fe12:3459/64 scope link
        valid_lft forever preferred_lft forever
root@ast2600-default:~# grep  eth4 /proc/interrupts
  82:        155          0  PCIe MSI 67633152 Edge      eth4-rx-0
  83:        139          0  PCIe MSI 67633153 Edge      eth4-tx-0
  84:          4          0  PCIe MSI 67633154 Edge      eth4
root@ast2600-default:~# dmesg  | grep e1000e
[    1.349634] e1000e: Intel(R) PRO/1000 Network Driver
[    1.350111] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[   12.940541] e1000e 0000:81:00.0: Interrupt Throttling Rate (ints/sec) set to dynamic conservative mode
[   13.008532] e1000e 0000:81:00.0 0000:81:00.0 (uninitialized): registered PHC clock
[   13.079534] e1000e 0000:81:00.0 eth4: (PCI Express:2.5GT/s:Width x1) 52:54:00:12:34:59
[   13.080149] e1000e 0000:81:00.0 eth4: Intel(R) PRO/1000 Network Connection
[   13.080612] e1000e 0000:81:00.0 eth4: MAC: 3, PHY: 8, PBA No: 000000-000
[   38.428521] e1000e 0000:81:00.0 eth4: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx

Thanks for looking.

C.


  reply	other threads:[~2025-09-17 10:22 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-09-11  7:24 [PATCH v2 00/14] Support PCIe RC to AST2600 and AST2700 Jamin Lin via
2025-09-11  7:24 ` [PATCH v2 01/14] hw/pci/pci_ids Add PCI vendor ID for ASPEED Jamin Lin via
2025-09-11  7:24 ` [PATCH v2 02/14] hw/pci-host/aspeed: Add AST2600 PCIe PHY model Jamin Lin via
2025-09-15  9:20   ` [SPAM] " Cédric Le Goater
2025-09-16  5:32     ` Jamin Lin
2025-09-11  7:24 ` [PATCH v2 03/14] hw/pci-host/aspeed: Add AST2600 PCIe config space and host bridge Jamin Lin via
2025-09-15 16:51   ` [SPAM] " Cédric Le Goater
2025-09-17  1:45     ` Jamin Lin
2025-09-17  9:05       ` Jamin Lin
2025-09-17 10:21         ` Cédric Le Goater [this message]
2025-09-11  7:24 ` [PATCH v2 04/14] hw/pci-host/aspeed: Add AST2600 PCIe Root Device support Jamin Lin via
2025-09-15 16:53   ` [SPAM] " Cédric Le Goater
2025-09-16  2:42     ` Jamin Lin
2025-09-11  7:24 ` [PATCH v2 05/14] hw/pci-host/aspeed: Add AST2600 PCIe Root Port and make address configurable Jamin Lin via
2025-09-15 16:54   ` [SPAM] " Cédric Le Goater
2025-09-16  2:51     ` Jamin Lin
2025-09-11  7:24 ` [PATCH v2 06/14] hw/pci-host/aspeed: Add MSI support and per-RC IOMMU address space Jamin Lin via
2025-09-11  7:24 ` [PATCH v2 07/14] hw/arm/aspeed: Wire up PCIe devices in SoC model Jamin Lin via
2025-09-15 17:14   ` [SPAM] " Cédric Le Goater
2025-09-11  7:24 ` [PATCH v2 08/14] hw/arm/aspeed_ast2600: Add PCIe RC support (RC_H only) Jamin Lin via
2025-09-15 17:19   ` [SPAM] " Cédric Le Goater
2025-09-16  3:41     ` Jamin Lin
2025-09-11  7:24 ` [PATCH v2 09/14] hw/pci-host/aspeed: Add AST2700 PCIe PHY Jamin Lin via
2025-09-11  7:24 ` [PATCH v2 10/14] hw/pci-host/aspeed: Add AST2700 PCIe config with dedicated H2X blocks Jamin Lin via
2025-09-15 17:23   ` [SPAM] " Cédric Le Goater
2025-09-17  1:48     ` Jamin Lin
2025-09-11  7:24 ` [PATCH v2 11/14] hw/pci-host/aspeed: Disable Root Device and place Root Port at 00:00.0 to AST2700 Jamin Lin via
2025-09-11  7:24 ` [PATCH v2 12/14] hw/arm/aspeed_ast27x0: Introduce 3 PCIe RCs for AST2700 Jamin Lin via
2025-09-11  7:24 ` [PATCH v2 13/14] tests/functional/arm/test_aspeed_ast2600: add PCIe enumeration test Jamin Lin via
2025-09-15 17:21   ` [SPAM] " Cédric Le Goater
2025-09-16  7:30     ` Jamin Lin
2025-09-16  7:41       ` Cédric Le Goater
2025-09-16  7:44         ` Jamin Lin
2025-09-11  7:24 ` [PATCH v2 14/14] tests/functional/aarch64/aspeed_ast2700: " Jamin Lin via

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=843f49ae-f5b0-4033-be7c-d876d23043a5@kaod.org \
    --to=clg@kaod.org \
    --cc=andrew@codeconstruct.com.au \
    --cc=jamin_lin@aspeedtech.com \
    --cc=joel@jms.id.au \
    --cc=leetroy@gmail.com \
    --cc=marcel.apfelbaum@gmail.com \
    --cc=mst@redhat.com \
    --cc=nabihestefan@google.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=steven_lee@aspeedtech.com \
    --cc=titusr@google.com \
    --cc=troy_lee@aspeedtech.com \
    --cc=wuhaotsh@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).