FYI, now that Jared's virtio-scsi-pci boot series is merged, this patch does 
not apply.

On 9/14/2026 3:34 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 <[email protected]>
Reviewed-by: Jared Rossi <[email protected]>
---
  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 | 20 +++++++++++++++++
  4 files changed, 62 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 */
case VIRTIO_ID_SCSI has been added here

..snip...

diff --git a/pc-bios/s390-ccw/virtio-pci.c b/pc-bios/s390-ccw/virtio-pci.c
index f501252c81..fd794bad8f 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;
      }
some new cases were added here also

@@ -199,6 +203,17 @@ 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;
+
+    /*
+     * Byte-swapping is not needed as only the MAC address (byte array)
+     * is used here. Byte-swap if other fields are added.
+     */
+    return vpci_read_flex(d_cap.off, d_cap.bar, cfg, sizeof(VirtioNetConfig));
+}
+
  static int virtio_pci_negotiate(void)
  {
      int i, rc;
@@ -330,6 +345,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;
here also

@@ -384,6 +400,10 @@ 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;
+        virtio_pci_get_net_config();
+        break;
      default:
          puts("Unsupported virtio device");
          return -ENODEV;
here also

Reply via email to