[virtio] Refactor VirtIOBlkIterator to PciTransportIterator

Enables iteration over various types of VirtIO devices.

Test: atest MicrodroidHostTests
Bug: 284462758
Change-Id: If31961f266b375f00145bd81c25712681d26e61d
diff --git a/pvmfw/src/instance.rs b/pvmfw/src/instance.rs
index b96ae1e..56468b2 100644
--- a/pvmfw/src/instance.rs
+++ b/pvmfw/src/instance.rs
@@ -29,9 +29,9 @@
 use diced_open_dice::Hidden;
 use log::trace;
 use uuid::Uuid;
-use virtio_drivers::transport::pci::bus::PciRoot;
+use virtio_drivers::transport::{pci::bus::PciRoot, DeviceType, Transport};
 use vmbase::util::ceiling_div;
-use vmbase::virtio::pci::VirtIOBlkIterator;
+use vmbase::virtio::pci::{PciTransportIterator, VirtIOBlk};
 use zerocopy::AsBytes;
 use zerocopy::FromBytes;
 
@@ -60,6 +60,8 @@
     RecordedDiceModeMismatch,
     /// Size of the instance.img entry being read or written is not supported.
     UnsupportedEntrySize(usize),
+    /// Failed to create VirtIO Block device.
+    VirtIOBlkCreationFailed(virtio_drivers::Error),
 }
 
 impl fmt::Display for Error {
@@ -89,6 +91,9 @@
             Self::RecordedCodeHashMismatch => write!(f, "Recorded code hash doesn't match"),
             Self::RecordedDiceModeMismatch => write!(f, "Recorded DICE mode doesn't match"),
             Self::UnsupportedEntrySize(sz) => write!(f, "Invalid entry size: {sz}"),
+            Self::VirtIOBlkCreationFailed(e) => {
+                write!(f, "Failed to create VirtIO Block device: {e}")
+            }
         }
     }
 }
@@ -178,7 +183,10 @@
 }
 
 fn find_instance_img(pci_root: &mut PciRoot) -> Result<Partition> {
-    for device in VirtIOBlkIterator::new(pci_root) {
+    for transport in
+        PciTransportIterator::new(pci_root).filter(|t| DeviceType::Block == t.device_type())
+    {
+        let device = VirtIOBlk::new(transport).map_err(Error::VirtIOBlkCreationFailed)?;
         match Partition::get_by_name(device, "vm-instance") {
             Ok(Some(p)) => return Ok(p),
             Ok(None) => {}