On Thu, Jul 22, 2021 at 01:26:36PM +0200, Gerd Hoffmann wrote:
Hi,
https://github.com/intel/gvt-linux/blob/topic/gvt-xengt/drivers/gpu/drm/i915...
But it's hard for some customers to contribute their own "hypervisor" module to the upstream Linux kernel. I am thinking what would be a better solution here? The MPT layer in the kernel helps a lot for customers, but only one open-source "hypervisor" module is there in the kernel. That can confuse people which don't know the story. One thing I was thinking is to put a document about the background and more description in the MPT headers. So it won't confuse more people.
Getting the xengt module linked above merged into mainline would also nicely explain why there are hypervisor modules.
It would also be nice to explain why a GPU driver needs a hypervisor specific shim like this in the first place.
enum hypervisor_type type; int (*host_init)(struct device *dev, void *gvt, const void *ops); void (*host_exit)(struct device *dev, void *gvt); int (*attach_vgpu)(void *vgpu, unsigned long *handle); void (*detach_vgpu)(void *vgpu);
Doesn't vfio provide all this generically with notifiers?
int (*inject_msi)(unsigned long handle, u32 addr, u16 data);
Isn't this one just an eventfd?
unsigned long (*from_virt_to_mfn)(void *p); int (*read_gpa)(unsigned long handle, unsigned long gpa, void *buf, unsigned long len); int (*write_gpa)(unsigned long handle, unsigned long gpa, void *buf, unsigned long len); unsigned long (*gfn_to_mfn)(unsigned long handle, unsigned long gfn);
int (*dma_map_guest_page)(unsigned long handle, unsigned long gfn, unsigned long size, dma_addr_t *dma_addr); void (*dma_unmap_guest_page)(unsigned long handle, dma_addr_t dma_addr);
int (*dma_pin_guest_page)(unsigned long handle, dma_addr_t dma_addr);
int (*map_gfn_to_mfn)(unsigned long handle, unsigned long gfn, unsigned long mfn, unsigned int nr, bool map); bool (*is_valid_gfn)(unsigned long handle, unsigned long gfn);
Shouldn't the vfio page SW IOMMU do all of this generically?
int (*enable_page_track)(unsigned long handle, u64 gfn); int (*disable_page_track)(unsigned long handle, u64 gfn); int (*set_trap_area)(unsigned long handle, u64 start, u64 end, bool map); int (*set_opregion)(void *vgpu); int (*set_edid)(void *vgpu, int port_num);
edid depends on hypervisor??
int (*get_vfio_device)(void *vgpu); void (*put_vfio_device)(void *vgpu);
Jason