From: "Jason J. Herne" <jjherne@linux.ibm.com>
To: Zhuoying Cai <zycai@linux.ibm.com>,
qemu-devel@nongnu.org, qemu-s390x@nongnu.org
Cc: mst@redhat.com, jrossi@linux.ibm.com, borntraeger@linux.ibm.com,
cohuck@redhat.com, farman@linux.ibm.com, mjrosato@linux.ibm.com,
pasic@linux.ibm.com, farosas@suse.de, lvivier@redhat.com,
jdaley@linux.ibm.com, pbonzini@redhat.com
Subject: Re: [PATCH v2 4/7] pc-bios/s390-ccw: Add support for virtio-net-pci IPL
Date: Wed, 9 Sep 2026 09:28:16 -0400 [thread overview]
Message-ID: <e65f6962-ae40-4731-ab21-34b4626540ef@linux.ibm.com> (raw)
In-Reply-To: <20260903162449.2588271-5-zycai@linux.ibm.com>
On 9/3/26 12:24 PM, Zhuoying Cai wrote:
> Enable network booting via virtio-net-pci by implementing PCI transport
> support for virtio-net.
>
> This patch also extends endianness handling for virtio PCI ring operations in
> little-endian to ensure correct behavior on s390x.
>
> Signed-off-by: Zhuoying Cai <zycai@linux.ibm.com>
> ---
> pc-bios/s390-ccw/main.c | 1 +
> pc-bios/s390-ccw/netmain.c | 9 +++++++-
> pc-bios/s390-ccw/virtio-net.c | 41 ++++++++++++++++++++++++++++-------
> pc-bios/s390-ccw/virtio-pci.c | 18 +++++++++++++++
> 4 files changed, 60 insertions(+), 9 deletions(-)
>
> diff --git a/pc-bios/s390-ccw/main.c b/pc-bios/s390-ccw/main.c
> index 8fc1cbf653..28cab3b411 100644
> --- a/pc-bios/s390-ccw/main.c
> +++ b/pc-bios/s390-ccw/main.c
> @@ -332,6 +332,7 @@ static void ipl_pci_device(void)
> }
>
> switch (vdev->dev_type) {
> + case VIRTIO_ID_NET:
> case VIRTIO_ID_BLOCK:
> if (virtio_setup() == 0) {
> zipl_load(); /* only return on error */
> diff --git a/pc-bios/s390-ccw/netmain.c b/pc-bios/s390-ccw/netmain.c
> index bcb62bf6ca..e42e049063 100644
> --- a/pc-bios/s390-ccw/netmain.c
> +++ b/pc-bios/s390-ccw/netmain.c
> @@ -498,7 +498,14 @@ int netmain(void)
> sclp_setup();
> puts("Network boot starting...");
>
> - if (!virtio_ccw_net_setup()) {
> + /*
> + * CCW devices require subchannel enumeration here.
> + * PCI devices don't require specific setup: the transport is already
> + * initialized by ipl_pci_device(), and virtio_is_supported() is checked
> + * later in virtio_net_init().
> + */
> + if (virtio_get_device()->ipl_type == S390_IPL_TYPE_CCW &&
> + !virtio_ccw_net_setup()) {
> puts("No valid virtio ccw net device found.");
> return -1;
> }
> diff --git a/pc-bios/s390-ccw/virtio-net.c b/pc-bios/s390-ccw/virtio-net.c
> index afa728bc32..418759565d 100644
> --- a/pc-bios/s390-ccw/virtio-net.c
> +++ b/pc-bios/s390-ccw/virtio-net.c
> @@ -68,7 +68,22 @@ int virtio_net_init(void *mac_addr)
> rx_last_idx = 0;
>
> vdev->guest_features[0] = VIRTIO_NET_F_MAC_BIT;
> - virtio_ccw_setup(vdev);
> + switch (virtio_get_device()->ipl_type) {
> + case S390_IPL_TYPE_CCW:
> + if (virtio_ccw_setup(vdev)) {
> + puts("Setup failed for virtio-net-ccw");
> + return -1;
> + }
> + break;
> + case S390_IPL_TYPE_PCI:
> + if (virtio_pci_setup(vdev)) {
> + puts("Setup failed for virtio-net-pci");
> + return -1;
> + }
> + break;
> + default:
> + return -1;
> + }
>
> if (!(vdev->guest_features[0] & VIRTIO_NET_F_MAC_BIT)) {
> puts("virtio-net device does not support the MAC address feature");
> @@ -121,22 +136,30 @@ int recv(int fd, void *buf, int maxlen, int flags)
> VRing *rxvq = &vdev->vrings[VQ_RX];
> int len, id;
> uint8_t *pkt;
> + uint16_t rx_used_idx, rx_avail_idx;
> + uint32_t rx_used_len, rx_used_id;
> + uint64_t rx_desc_addr;
>
> - if (rx_last_idx == rxvq->used->idx) {
> + rx_used_idx = virtio_tswap16(rxvq->used->idx);
> + if (rx_last_idx == rx_used_idx) {
> return 0;
> }
>
> - len = rxvq->used->ring[rx_last_idx % rxvq->num].len - virtio_net_hdr_size;
> + rx_used_len = virtio_tswap32(rxvq->used->ring[rx_last_idx % rxvq->num].len);
> + rx_used_id = virtio_tswap32(rxvq->used->ring[rx_last_idx % rxvq->num].id);
> +
> + len = rx_used_len - virtio_net_hdr_size;
> if (len > maxlen) {
> puts("virtio-net: Receive buffer too small");
> len = maxlen;
> }
> - id = rxvq->used->ring[rx_last_idx % rxvq->num].id % rxvq->num;
> - pkt = (uint8_t *)(rxvq->desc[id].addr + virtio_net_hdr_size);
> + id = rx_used_id % rxvq->num;
> + rx_desc_addr = virtio_tswap64(rxvq->desc[id].addr);
> + pkt = (uint8_t *)(rx_desc_addr + virtio_net_hdr_size);
>
> #if DEBUG_VIRTIO_NET /* Dump packet */
> int i;
> - printf("\nbuf %p: len=%i\n", (void *)rxvq->desc[id].addr, len);
> + printf("\nbuf %p: len=%i\n", (void *)rx_desc_addr, len);
> for (i = 0; i < 64; i++) {
> printf(" %02x", pkt[i]);
> if ((i % 16) == 15) {
> @@ -150,8 +173,10 @@ int recv(int fd, void *buf, int maxlen, int flags)
> memcpy(buf, pkt, len);
>
> /* Mark buffer as available to the host again */
> - rxvq->avail->ring[rxvq->avail->idx % rxvq->num] = id;
> - rxvq->avail->idx = rxvq->avail->idx + 1;
> + rx_avail_idx = virtio_tswap16(rxvq->avail->idx);
> + rxvq->avail->ring[rx_avail_idx % rxvq->num] = virtio_tswap16(id);
> + rx_avail_idx++;
> + rxvq->avail->idx = virtio_tswap16(rx_avail_idx);
> vring_notify(rxvq);
>
> /* Move index to next entry */
> diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c
> index f501252c81..147a82895f 100644
> --- a/pc-bios/s390-ccw/virtio-pci.c
> +++ b/pc-bios/s390-ccw/virtio-pci.c
> @@ -52,6 +52,10 @@ void virtio_pci_id2type(VDev *vdev, uint16_t device_id)
> case 0x1001:
> vdev->dev_type = VIRTIO_ID_BLOCK;
> break;
> + case 0x1041:
> + case 0x1000:
> + vdev->dev_type = VIRTIO_ID_NET;
> + break;
> default:
> vdev->dev_type = 0;
> }
> @@ -199,6 +203,14 @@ static int virtio_pci_get_blk_config(void)
> return rc;
> }
>
> +static int virtio_pci_get_net_config(void)
> +{
> + VirtioNetConfig *cfg = &virtio_get_device()->config.net;
> + int rc = vpci_read_flex(d_cap.off, d_cap.bar, cfg, sizeof(VirtioNetConfig));
> +
> + return rc;
> +}
> +
Simplify to this:
static int virtio_pci_get_net_config(void)
{
VirtioNetConfig *cfg = &virtio_get_device()->config.net;
return vpci_read_flex(d_cap.off, d_cap.bar, cfg,
sizeof(VirtioNetConfig));
}
> static int virtio_pci_negotiate(void)
> {
> int i, rc;
> @@ -330,6 +342,7 @@ bool virtio_pci_is_supported(VDev *vdev)
> if (vdev->vendor_id == PCI_VENDOR_VIRTIO) {
> switch (vdev->dev_type) {
> case VIRTIO_ID_BLOCK:
> + case VIRTIO_ID_NET:
> return true;
> default:
> return false;
> @@ -384,6 +397,11 @@ int virtio_pci_setup(VDev *vdev)
> vdev->cmd_vr_idx = 0;
> virtio_pci_get_blk_config();
> break;
> + case VIRTIO_ID_NET:
> + vdev->nr_vqs = 2;
> + vdev->cmd_vr_idx = 0;
cmd_vr_idx is never actually used for net devices. I'm thinking we want
to skip setting it here. It's actually already set to 0 above, in common
code, before we know what device type we're dealing with.
next prev parent reply other threads:[~2026-09-09 17:54 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-03 16:24 [PATCH v2 0/7] s390x: Add support for virtio-net-pci boot device Zhuoying Cai
2026-09-03 16:24 ` [PATCH v2 1/7] pc-bios/s390-ccw: Move CCW net setup to virtio-ccw Zhuoying Cai
2026-09-09 12:49 ` Jason J. Herne
2026-09-09 15:10 ` Matthew Rosato
2026-09-11 15:15 ` Jared Rossi
2026-09-03 16:24 ` [PATCH v2 2/7] pc-bios/s390-ccw: Add dynamic net header size handling Zhuoying Cai
2026-09-08 18:32 ` Jared Rossi
2026-09-09 13:44 ` Zhuoying Cai
2026-09-09 15:08 ` Matthew Rosato
2026-09-03 16:24 ` [PATCH v2 3/7] pc-bios/s390-ccw: Introduce virtio_tswap helpers Zhuoying Cai
2026-09-11 15:19 ` Jared Rossi
2026-09-03 16:24 ` [PATCH v2 4/7] pc-bios/s390-ccw: Add support for virtio-net-pci IPL Zhuoying Cai
2026-09-09 13:28 ` Jason J. Herne [this message]
2026-09-03 16:24 ` [PATCH v2 5/7] hw/virtio: Add "loadparm" property to virtio net PCI devices booting on s390x Zhuoying Cai
2026-09-09 13:30 ` Jason J. Herne
2026-09-11 15:17 ` Jared Rossi
2026-09-03 16:24 ` [PATCH v2 6/7] tests/qtest: Add s390x virtio net PCI test to pxe-test.c Zhuoying Cai
2026-09-11 15:36 ` Matthew Rosato
2026-09-03 16:24 ` [PATCH v2 7/7] tests/functional/s390x: Add tests for virtio net PCI in test_pxelinux.py Zhuoying Cai
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=e65f6962-ae40-4731-ab21-34b4626540ef@linux.ibm.com \
--to=jjherne@linux.ibm.com \
--cc=borntraeger@linux.ibm.com \
--cc=cohuck@redhat.com \
--cc=farman@linux.ibm.com \
--cc=farosas@suse.de \
--cc=jdaley@linux.ibm.com \
--cc=jrossi@linux.ibm.com \
--cc=lvivier@redhat.com \
--cc=mjrosato@linux.ibm.com \
--cc=mst@redhat.com \
--cc=pasic@linux.ibm.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-s390x@nongnu.org \
--cc=zycai@linux.ibm.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.