Merge tag 'gvt-fixes-2018-01-17' of https://github.com/intel/gvt-linux into drm-intel-fixes
gvt-fixes-2018-01-17 - Fix one register cmd parser failure (Colin) - Fix region cleanup for vGPU destroy (Henry) - Fix mmap size check (Zhenyu) Signed-off-by: Jani Nikula <jani.nikula@intel.com> From: Zhenyu Wang <zhenyuw@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190117074604.GI18272@zhen-hp.sh.intel.com
This commit is contained in:
commit
15c05196ff
@ -2799,6 +2799,7 @@ static int init_broadwell_mmio_info(struct intel_gvt *gvt)
|
||||
MMIO_DFH(_MMIO(0xe2a0), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0xe2b0), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0xe2c0), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
MMIO_DFH(_MMIO(0x21f0), D_BDW_PLUS, F_CMD_ACCESS, NULL, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -41,7 +41,7 @@ struct intel_gvt_mpt {
|
||||
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)(unsigned long handle);
|
||||
void (*detach_vgpu)(void *vgpu);
|
||||
int (*inject_msi)(unsigned long handle, u32 addr, u16 data);
|
||||
unsigned long (*from_virt_to_mfn)(void *p);
|
||||
int (*enable_page_track)(unsigned long handle, u64 gfn);
|
||||
|
@ -996,7 +996,7 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
|
||||
{
|
||||
unsigned int index;
|
||||
u64 virtaddr;
|
||||
unsigned long req_size, pgoff = 0;
|
||||
unsigned long req_size, pgoff, req_start;
|
||||
pgprot_t pg_prot;
|
||||
struct intel_vgpu *vgpu = mdev_get_drvdata(mdev);
|
||||
|
||||
@ -1014,7 +1014,17 @@ static int intel_vgpu_mmap(struct mdev_device *mdev, struct vm_area_struct *vma)
|
||||
pg_prot = vma->vm_page_prot;
|
||||
virtaddr = vma->vm_start;
|
||||
req_size = vma->vm_end - vma->vm_start;
|
||||
pgoff = vgpu_aperture_pa_base(vgpu) >> PAGE_SHIFT;
|
||||
pgoff = vma->vm_pgoff &
|
||||
((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
|
||||
req_start = pgoff << PAGE_SHIFT;
|
||||
|
||||
if (!intel_vgpu_in_aperture(vgpu, req_start))
|
||||
return -EINVAL;
|
||||
if (req_start + req_size >
|
||||
vgpu_aperture_offset(vgpu) + vgpu_aperture_sz(vgpu))
|
||||
return -EINVAL;
|
||||
|
||||
pgoff = (gvt_aperture_pa_base(vgpu->gvt) >> PAGE_SHIFT) + pgoff;
|
||||
|
||||
return remap_pfn_range(vma, virtaddr, pgoff, req_size, pg_prot);
|
||||
}
|
||||
@ -1662,9 +1672,21 @@ static int kvmgt_attach_vgpu(void *vgpu, unsigned long *handle)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kvmgt_detach_vgpu(unsigned long handle)
|
||||
static void kvmgt_detach_vgpu(void *p_vgpu)
|
||||
{
|
||||
/* nothing to do here */
|
||||
int i;
|
||||
struct intel_vgpu *vgpu = (struct intel_vgpu *)p_vgpu;
|
||||
|
||||
if (!vgpu->vdev.region)
|
||||
return;
|
||||
|
||||
for (i = 0; i < vgpu->vdev.num_regions; i++)
|
||||
if (vgpu->vdev.region[i].ops->release)
|
||||
vgpu->vdev.region[i].ops->release(vgpu,
|
||||
&vgpu->vdev.region[i]);
|
||||
vgpu->vdev.num_regions = 0;
|
||||
kfree(vgpu->vdev.region);
|
||||
vgpu->vdev.region = NULL;
|
||||
}
|
||||
|
||||
static int kvmgt_inject_msi(unsigned long handle, u32 addr, u16 data)
|
||||
|
@ -101,7 +101,7 @@ static inline void intel_gvt_hypervisor_detach_vgpu(struct intel_vgpu *vgpu)
|
||||
if (!intel_gvt_host.mpt->detach_vgpu)
|
||||
return;
|
||||
|
||||
intel_gvt_host.mpt->detach_vgpu(vgpu->handle);
|
||||
intel_gvt_host.mpt->detach_vgpu(vgpu);
|
||||
}
|
||||
|
||||
#define MSI_CAP_CONTROL(offset) (offset + 2)
|
||||
|
Loading…
Reference in New Issue
Block a user