static int cirrus_kick_out_firmware_fb(struct pci_dev *pdev) { struct apertures_struct *ap; bool primary = false; ap = alloc_apertures(1); if (!ap) return -ENOMEM; ap->ranges[0].base = pci_resource_start(pdev, 0); ap->ranges[0].size = pci_resource_len(pdev, 0); #ifdef CONFIG_X86 primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; #endif remove_conflicting_framebuffers(ap, "cirrusdrmfb", primary); kfree(ap); return 0; }
static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) { struct apertures_struct *ap; struct pci_dev *pdev = dev_priv->dev->pdev; bool primary; int ret; ap = alloc_apertures(1); if (!ap) return -ENOMEM; ap->ranges[0].base = dev_priv->gtt.mappable_base; ap->ranges[0].size = dev_priv->gtt.mappable_end; primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; ret = remove_conflicting_framebuffers(ap, "inteldrmfb", primary); kfree(ap); return ret; }
/* Get framebuffer memory from Hyper-V video pci space */ static int hvfb_getmem(struct fb_info *info) { struct hvfb_par *par = info->par; struct pci_dev *pdev = NULL; void __iomem *fb_virt; int gen2vm = efi_enabled(EFI_BOOT); int ret; par->mem.name = KBUILD_MODNAME; par->mem.flags = IORESOURCE_MEM | IORESOURCE_BUSY; if (gen2vm) { ret = allocate_resource(&hyperv_mmio, &par->mem, screen_fb_size, 0, -1, screen_fb_size, NULL, NULL); if (ret != 0) { pr_err("Unable to allocate framebuffer memory\n"); return -ENODEV; } } else { pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT, PCI_DEVICE_ID_HYPERV_VIDEO, NULL); if (!pdev) { pr_err("Unable to find PCI Hyper-V video\n"); return -ENODEV; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) || pci_resource_len(pdev, 0) < screen_fb_size) goto err1; par->mem.end = pci_resource_end(pdev, 0); par->mem.start = par->mem.end - screen_fb_size + 1; ret = request_resource(&pdev->resource[0], &par->mem); if (ret != 0) { pr_err("Unable to request framebuffer memory\n"); goto err1; } } fb_virt = ioremap(par->mem.start, screen_fb_size); if (!fb_virt) goto err2; info->apertures = alloc_apertures(1); if (!info->apertures) goto err3; if (gen2vm) { info->apertures->ranges[0].base = screen_info.lfb_base; info->apertures->ranges[0].size = screen_info.lfb_size; remove_conflicting_framebuffers(info->apertures, KBUILD_MODNAME, false); } else { info->apertures->ranges[0].base = pci_resource_start(pdev, 0); info->apertures->ranges[0].size = pci_resource_len(pdev, 0); } info->fix.smem_start = par->mem.start; info->fix.smem_len = screen_fb_size; info->screen_base = fb_virt; info->screen_size = screen_fb_size; if (!gen2vm) pci_dev_put(pdev); return 0; err3: iounmap(fb_virt); err2: release_resource(&par->mem); err1: if (!gen2vm) pci_dev_put(pdev); return -ENOMEM; }
/* Get framebuffer memory from Hyper-V video pci space */ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info) { struct hvfb_par *par = info->par; struct pci_dev *pdev = NULL; void __iomem *fb_virt; int gen2vm = efi_enabled(EFI_BOOT); resource_size_t pot_start, pot_end; int ret; if (gen2vm) { pot_start = 0; pot_end = -1; } else { pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT, PCI_DEVICE_ID_HYPERV_VIDEO, NULL); if (!pdev) { pr_err("Unable to find PCI Hyper-V video\n"); return -ENODEV; } if (!(pci_resource_flags(pdev, 0) & IORESOURCE_MEM) || pci_resource_len(pdev, 0) < screen_fb_size) goto err1; pot_end = pci_resource_end(pdev, 0); pot_start = pot_end - screen_fb_size + 1; } ret = vmbus_allocate_mmio(&par->mem, hdev, pot_start, pot_end, screen_fb_size, 0x100000, true); if (ret != 0) { pr_err("Unable to allocate framebuffer memory\n"); goto err1; } fb_virt = ioremap(par->mem->start, screen_fb_size); if (!fb_virt) goto err2; info->apertures = alloc_apertures(1); if (!info->apertures) goto err3; if (gen2vm) { info->apertures->ranges[0].base = screen_info.lfb_base; info->apertures->ranges[0].size = screen_info.lfb_size; remove_conflicting_framebuffers(info->apertures, KBUILD_MODNAME, false); } else { info->apertures->ranges[0].base = pci_resource_start(pdev, 0); info->apertures->ranges[0].size = pci_resource_len(pdev, 0); } info->fix.smem_start = par->mem->start; info->fix.smem_len = screen_fb_size; info->screen_base = fb_virt; info->screen_size = screen_fb_size; if (!gen2vm) pci_dev_put(pdev); return 0; err3: iounmap(fb_virt); err2: vmbus_free_mmio(par->mem->start, screen_fb_size); par->mem = NULL; err1: if (!gen2vm) pci_dev_put(pdev); return -ENOMEM; }