On Sat, 19 Sep 2020 11:28:38 -0400 Matthew Rosato <mjrosato@xxxxxxxxxxxxx> wrote: > Define a new configuration entry VFIO_PCI_ZDEV for VFIO/PCI. > > When this s390-only feature is configured we initialize a new device > region, VFIO_REGION_SUBTYPE_IBM_ZPCI_CLP, to hold information provided > by the underlying hardware. > > This patch is based on work previously done by Pierre Morel. > > Signed-off-by: Matthew Rosato <mjrosato@xxxxxxxxxxxxx> > --- > drivers/vfio/pci/Kconfig | 13 ++ > drivers/vfio/pci/Makefile | 1 + > drivers/vfio/pci/vfio_pci.c | 8 ++ > drivers/vfio/pci/vfio_pci_private.h | 10 ++ > drivers/vfio/pci/vfio_pci_zdev.c | 242 ++++++++++++++++++++++++++++++++++++ Maybe you want to add yourself to MAINTAINERS for the zdev-specific files? You're probably better suited to review changes to the zpci-specific code :) > 5 files changed, 274 insertions(+) > create mode 100644 drivers/vfio/pci/vfio_pci_zdev.c (...) > +int vfio_pci_zdev_init(struct vfio_pci_device *vdev) > +{ > + struct vfio_region_zpci_info *region; > + struct zpci_dev *zdev; > + size_t clp_offset; > + int size; > + int ret; > + > + if (!vdev->pdev->bus) > + return -ENODEV; > + > + zdev = to_zpci(vdev->pdev); > + if (!zdev) > + return -ENODEV; > + > + /* Calculate size needed for all supported CLP features */ > + size = sizeof(*region) + > + sizeof(struct vfio_region_zpci_info_qpci) + > + sizeof(struct vfio_region_zpci_info_qpcifg) + > + (sizeof(struct vfio_region_zpci_info_util) + CLP_UTIL_STR_LEN) + > + (sizeof(struct vfio_region_zpci_info_pfip) + > + CLP_PFIP_NR_SEGMENTS); > + > + region = kmalloc(size, GFP_KERNEL); > + if (!region) > + return -ENOMEM; > + > + /* Fill in header */ > + region->argsz = size; > + clp_offset = region->offset = sizeof(struct vfio_region_zpci_info); > + > + /* Fill the supported CLP features */ > + clp_offset = vfio_pci_zdev_add_qpci(zdev, region, clp_offset); > + clp_offset = vfio_pci_zdev_add_qpcifg(zdev, region, clp_offset); > + clp_offset = vfio_pci_zdev_add_util(zdev, region, clp_offset); > + clp_offset = vfio_pci_zdev_add_pfip(zdev, region, clp_offset); So, the regions are populated once. Can any of the values in the hardware structures be modified by a guest? Or changed from the hardware side? > + > + ret = vfio_pci_register_dev_region(vdev, > + PCI_VENDOR_ID_IBM | VFIO_REGION_TYPE_PCI_VENDOR_TYPE, > + VFIO_REGION_SUBTYPE_IBM_ZPCI_CLP, &vfio_pci_zdev_regops, > + size, VFIO_REGION_INFO_FLAG_READ, region); > + if (ret) > + kfree(region); > + > + return ret; > +}