diff options
Diffstat (limited to 'drivers/gpu/drm/hyperv/hyperv_drm_drv.c')
| -rw-r--r-- | drivers/gpu/drm/hyperv/hyperv_drm_drv.c | 19 | 
1 files changed, 18 insertions, 1 deletions
| diff --git a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c index cd818a629183..00e53de4812b 100644 --- a/drivers/gpu/drm/hyperv/hyperv_drm_drv.c +++ b/drivers/gpu/drm/hyperv/hyperv_drm_drv.c @@ -225,12 +225,29 @@ static int hyperv_vmbus_remove(struct hv_device *hdev)  {  	struct drm_device *dev = hv_get_drvdata(hdev);  	struct hyperv_drm_device *hv = to_hv(dev); +	struct pci_dev *pdev;  	drm_dev_unplug(dev);  	drm_atomic_helper_shutdown(dev);  	vmbus_close(hdev->channel);  	hv_set_drvdata(hdev, NULL); -	vmbus_free_mmio(hv->mem->start, hv->fb_size); + +	/* +	 * Free allocated MMIO memory only on Gen2 VMs. +	 * On Gen1 VMs, release the PCI device +	 */ +	if (efi_enabled(EFI_BOOT)) { +		vmbus_free_mmio(hv->mem->start, hv->fb_size); +	} else { +		pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT, +				      PCI_DEVICE_ID_HYPERV_VIDEO, NULL); +		if (!pdev) { +			drm_err(dev, "Unable to find PCI Hyper-V video\n"); +			return -ENODEV; +		} +		pci_release_region(pdev, 0); +		pci_dev_put(pdev); +	}  	return 0;  } |