Merge tag 'gvt-next-fixes-2020-08-05' of https://github.com/intel/gvt-linux into drm-intel-fixes
gvt-next-fixes-2020-08-05 - Fix guest suspend/resume low performance handling of shadow ppgtt (Colin) - Fix PV notifier handling for guest suspend/resume (Colin) Signed-off-by: Jani Nikula <jani.nikula@intel.com> From: Zhenyu Wang <zhenyuw@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200805080207.GY27035@zhen-hp.sh.intel.com
This commit is contained in:
commit
e9e3086b3d
@ -70,6 +70,7 @@ static void vgpu_pci_cfg_mem_write(struct intel_vgpu *vgpu, unsigned int off,
|
||||
{
|
||||
u8 *cfg_base = vgpu_cfg_space(vgpu);
|
||||
u8 mask, new, old;
|
||||
pci_power_t pwr;
|
||||
int i = 0;
|
||||
|
||||
for (; i < bytes && (off + i < sizeof(pci_cfg_space_rw_bmp)); i++) {
|
||||
@ -91,6 +92,15 @@ static void vgpu_pci_cfg_mem_write(struct intel_vgpu *vgpu, unsigned int off,
|
||||
/* For other configuration space directly copy as it is. */
|
||||
if (i < bytes)
|
||||
memcpy(cfg_base + off + i, src + i, bytes - i);
|
||||
|
||||
if (off == vgpu->cfg_space.pmcsr_off && vgpu->cfg_space.pmcsr_off) {
|
||||
pwr = (pci_power_t __force)(*(u16*)(&vgpu_cfg_space(vgpu)[off])
|
||||
& PCI_PM_CTRL_STATE_MASK);
|
||||
if (pwr == PCI_D3hot)
|
||||
vgpu->d3_entered = true;
|
||||
gvt_dbg_core("vgpu-%d power status changed to %d\n",
|
||||
vgpu->id, pwr);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -366,6 +376,7 @@ void intel_vgpu_init_cfg_space(struct intel_vgpu *vgpu,
|
||||
struct intel_gvt *gvt = vgpu->gvt;
|
||||
const struct intel_gvt_device_info *info = &gvt->device_info;
|
||||
u16 *gmch_ctl;
|
||||
u8 next;
|
||||
|
||||
memcpy(vgpu_cfg_space(vgpu), gvt->firmware.cfg_space,
|
||||
info->cfg_space_size);
|
||||
@ -401,6 +412,19 @@ void intel_vgpu_init_cfg_space(struct intel_vgpu *vgpu,
|
||||
pci_resource_len(gvt->gt->i915->drm.pdev, 2);
|
||||
|
||||
memset(vgpu_cfg_space(vgpu) + PCI_ROM_ADDRESS, 0, 4);
|
||||
|
||||
/* PM Support */
|
||||
vgpu->cfg_space.pmcsr_off = 0;
|
||||
if (vgpu_cfg_space(vgpu)[PCI_STATUS] & PCI_STATUS_CAP_LIST) {
|
||||
next = vgpu_cfg_space(vgpu)[PCI_CAPABILITY_LIST];
|
||||
do {
|
||||
if (vgpu_cfg_space(vgpu)[next + PCI_CAP_LIST_ID] == PCI_CAP_ID_PM) {
|
||||
vgpu->cfg_space.pmcsr_off = next + PCI_PM_CTRL;
|
||||
break;
|
||||
}
|
||||
next = vgpu_cfg_space(vgpu)[next + PCI_CAP_LIST_NEXT];
|
||||
} while (next);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2501,7 +2501,7 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
|
||||
return create_scratch_page_tree(vgpu);
|
||||
}
|
||||
|
||||
static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
|
||||
void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct list_head *pos, *n;
|
||||
struct intel_vgpu_mm *mm;
|
||||
|
@ -279,4 +279,6 @@ int intel_vgpu_emulate_ggtt_mmio_read(struct intel_vgpu *vgpu,
|
||||
int intel_vgpu_emulate_ggtt_mmio_write(struct intel_vgpu *vgpu,
|
||||
unsigned int off, void *p_data, unsigned int bytes);
|
||||
|
||||
void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu);
|
||||
|
||||
#endif /* _GVT_GTT_H_ */
|
||||
|
@ -106,6 +106,7 @@ struct intel_vgpu_pci_bar {
|
||||
struct intel_vgpu_cfg_space {
|
||||
unsigned char virtual_cfg_space[PCI_CFG_SPACE_EXP_SIZE];
|
||||
struct intel_vgpu_pci_bar bar[INTEL_GVT_MAX_BAR_NUM];
|
||||
u32 pmcsr_off;
|
||||
};
|
||||
|
||||
#define vgpu_cfg_space(vgpu) ((vgpu)->cfg_space.virtual_cfg_space)
|
||||
@ -198,6 +199,8 @@ struct intel_vgpu {
|
||||
struct intel_vgpu_submission submission;
|
||||
struct radix_tree_root page_track_tree;
|
||||
u32 hws_pga[I915_NUM_ENGINES];
|
||||
/* Set on PCI_D3, reset on DMLR, not reflecting the actual PM state */
|
||||
bool d3_entered;
|
||||
|
||||
struct dentry *debugfs;
|
||||
|
||||
|
@ -257,6 +257,7 @@ void intel_gvt_release_vgpu(struct intel_vgpu *vgpu)
|
||||
intel_gvt_deactivate_vgpu(vgpu);
|
||||
|
||||
mutex_lock(&vgpu->vgpu_lock);
|
||||
vgpu->d3_entered = false;
|
||||
intel_vgpu_clean_workloads(vgpu, ALL_ENGINES);
|
||||
intel_vgpu_dmabuf_cleanup(vgpu);
|
||||
mutex_unlock(&vgpu->vgpu_lock);
|
||||
@ -393,6 +394,7 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
|
||||
INIT_RADIX_TREE(&vgpu->page_track_tree, GFP_KERNEL);
|
||||
idr_init(&vgpu->object_idr);
|
||||
intel_vgpu_init_cfg_space(vgpu, param->primary);
|
||||
vgpu->d3_entered = false;
|
||||
|
||||
ret = intel_vgpu_init_mmio(vgpu);
|
||||
if (ret)
|
||||
@ -557,10 +559,15 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr,
|
||||
/* full GPU reset or device model level reset */
|
||||
if (engine_mask == ALL_ENGINES || dmlr) {
|
||||
intel_vgpu_select_submission_ops(vgpu, ALL_ENGINES, 0);
|
||||
intel_vgpu_invalidate_ppgtt(vgpu);
|
||||
if (engine_mask == ALL_ENGINES)
|
||||
intel_vgpu_invalidate_ppgtt(vgpu);
|
||||
/*fence will not be reset during virtual reset */
|
||||
if (dmlr) {
|
||||
intel_vgpu_reset_gtt(vgpu);
|
||||
if(!vgpu->d3_entered) {
|
||||
intel_vgpu_invalidate_ppgtt(vgpu);
|
||||
intel_vgpu_destroy_all_ppgtt_mm(vgpu);
|
||||
}
|
||||
intel_vgpu_reset_ggtt(vgpu, true);
|
||||
intel_vgpu_reset_resource(vgpu);
|
||||
}
|
||||
|
||||
@ -572,7 +579,14 @@ void intel_gvt_reset_vgpu_locked(struct intel_vgpu *vgpu, bool dmlr,
|
||||
intel_vgpu_reset_cfg_space(vgpu);
|
||||
/* only reset the failsafe mode when dmlr reset */
|
||||
vgpu->failsafe = false;
|
||||
vgpu->pv_notified = false;
|
||||
/*
|
||||
* PCI_D0 is set before dmlr, so reset d3_entered here
|
||||
* after done using.
|
||||
*/
|
||||
if(vgpu->d3_entered)
|
||||
vgpu->d3_entered = false;
|
||||
else
|
||||
vgpu->pv_notified = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user