diff options
Diffstat (limited to 'drivers/gpu/drm/virtio/virtgpu_drv.c')
| -rw-r--r-- | drivers/gpu/drm/virtio/virtgpu_drv.c | 53 | 
1 files changed, 13 insertions, 40 deletions
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.c b/drivers/gpu/drm/virtio/virtgpu_drv.c index 5f25a8d15464..0035affc3e59 100644 --- a/drivers/gpu/drm/virtio/virtgpu_drv.c +++ b/drivers/gpu/drm/virtio/virtgpu_drv.c @@ -46,12 +46,11 @@ static int virtio_gpu_modeset = -1;  MODULE_PARM_DESC(modeset, "Disable/Enable modesetting");  module_param_named(modeset, virtio_gpu_modeset, int, 0400); -static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vdev) +static int virtio_gpu_pci_quirk(struct drm_device *dev)  { -	struct pci_dev *pdev = to_pci_dev(vdev->dev.parent); +	struct pci_dev *pdev = to_pci_dev(dev->dev);  	const char *pname = dev_name(&pdev->dev);  	bool vga = (pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA; -	char unique[20];  	int ret;  	DRM_INFO("pci: %s detected at %s\n", @@ -63,39 +62,7 @@ static int virtio_gpu_pci_quirk(struct drm_device *dev, struct virtio_device *vd  			return ret;  	} -	/* -	 * Normally the drm_dev_set_unique() call is done by core DRM. -	 * The following comment covers, why virtio cannot rely on it. -	 * -	 * Unlike the other virtual GPU drivers, virtio abstracts the -	 * underlying bus type by using struct virtio_device. -	 * -	 * Hence the dev_is_pci() check, used in core DRM, will fail -	 * and the unique returned will be the virtio_device "virtio0", -	 * while a "pci:..." one is required. -	 * -	 * A few other ideas were considered: -	 * - Extend the dev_is_pci() check [in drm_set_busid] to -	 *   consider virtio. -	 *   Seems like a bigger hack than what we have already. -	 * -	 * - Point drm_device::dev to the parent of the virtio_device -	 *   Semantic changes: -	 *   * Using the wrong device for i2c, framebuffer_alloc and -	 *     prime import. -	 *   Visual changes: -	 *   * Helpers such as DRM_DEV_ERROR, dev_info, drm_printer, -	 *     will print the wrong information. -	 * -	 * We could address the latter issues, by introducing -	 * drm_device::bus_dev, ... which would be used solely for this. -	 * -	 * So for the moment keep things as-is, with a bulky comment -	 * for the next person who feels like removing this -	 * drm_dev_set_unique() quirk. -	 */ -	snprintf(unique, sizeof(unique), "pci:%s", pname); -	return drm_dev_set_unique(dev, unique); +	return 0;  }  static int virtio_gpu_probe(struct virtio_device *vdev) @@ -109,18 +76,24 @@ static int virtio_gpu_probe(struct virtio_device *vdev)  	if (virtio_gpu_modeset == 0)  		return -EINVAL; -	dev = drm_dev_alloc(&driver, &vdev->dev); +	/* +	 * The virtio-gpu device is a virtual device that doesn't have DMA +	 * ops assigned to it, nor DMA mask set and etc. Its parent device +	 * is actual GPU device we want to use it for the DRM's device in +	 * order to benefit from using generic DRM APIs. +	 */ +	dev = drm_dev_alloc(&driver, vdev->dev.parent);  	if (IS_ERR(dev))  		return PTR_ERR(dev);  	vdev->priv = dev; -	if (!strcmp(vdev->dev.parent->bus->name, "pci")) { -		ret = virtio_gpu_pci_quirk(dev, vdev); +	if (dev_is_pci(vdev->dev.parent)) { +		ret = virtio_gpu_pci_quirk(dev);  		if (ret)  			goto err_free;  	} -	ret = virtio_gpu_init(dev); +	ret = virtio_gpu_init(vdev, dev);  	if (ret)  		goto err_free;  |