.remove = hyperv_pci_remove,
};
-static int hyperv_setup_gen1(struct hyperv_drm_device *hv)
-{
- struct drm_device *dev = &hv->dev;
- struct pci_dev *pdev;
- int ret;
-
- 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;
- }
-
- ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &hyperv_driver);
- if (ret) {
- drm_err(dev, "Not able to remove boot fb\n");
- return ret;
- }
-
- if (pci_request_region(pdev, 0, DRIVER_NAME) != 0)
- drm_warn(dev, "Cannot request framebuffer, boot fb still active?\n");
-
- if ((pdev->resource[0].flags & IORESOURCE_MEM) == 0) {
- drm_err(dev, "Resource at bar 0 is not IORESOURCE_MEM\n");
- ret = -ENODEV;
- goto error;
- }
-
- hv->fb_base = pci_resource_start(pdev, 0);
- hv->fb_size = pci_resource_len(pdev, 0);
- if (!hv->fb_base) {
- drm_err(dev, "Resource not available\n");
- ret = -ENODEV;
- goto error;
- }
-
- hv->fb_size = min(hv->fb_size,
- (unsigned long)(hv->mmio_megabytes * 1024 * 1024));
- hv->vram = devm_ioremap(&pdev->dev, hv->fb_base, hv->fb_size);
- if (!hv->vram) {
- drm_err(dev, "Failed to map vram\n");
- ret = -ENOMEM;
- }
-
-error:
- pci_dev_put(pdev);
- return ret;
-}
-
-static int hyperv_setup_gen2(struct hyperv_drm_device *hv,
+static int hyperv_setup_vram(struct hyperv_drm_device *hv,
struct hv_device *hdev)
{
struct drm_device *dev = &hv->dev;
goto err_hv_set_drv_data;
}
- if (efi_enabled(EFI_BOOT))
- ret = hyperv_setup_gen2(hv, hdev);
- else
- ret = hyperv_setup_gen1(hv);
+ ret = hyperv_setup_vram(hv, hdev);
if (ret)
goto err_vmbus_close;
{
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);
- /*
- * 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);
- }
+ vmbus_free_mmio(hv->mem->start, hv->fb_size);
return 0;
}