[PATCH v2 1/2] drm: qxl: Open code probing sequence for qxl

Gustavo Padovan gustavo at padovan.org
Wed Jan 18 19:01:12 UTC 2017


Hi Gabriel,

2017-01-17 Gabriel Krisman Bertazi <krisman at collabora.co.uk>:

> This avoids using the deprecated drm_get_pci_dev() and load() hook
> interfaces in the qxl driver.
> 
> The only tricky part is to ensure TTM debugfs initialization happens
> after the debugfs root node is created, which is done by moving that
> code into the debufs_init() hook.
> 
> Tested on qemu with igt and running a WM on top of X.
> 
> Changes since v1:
>  - Drop verification for primary minor in qxl_debugsfs_init
> 
> Signed-off-by: Gabriel Krisman Bertazi <krisman at collabora.co.uk>
> Cc: Dave Airlie <airlied at redhat.com>
> Cc: Daniel Vetter <daniel.vetter at ffwll.ch>
> Cc: Gustavo Padovan <gustavo.padovan at collabora.com>
> ---
>  drivers/gpu/drm/qxl/qxl_debugfs.c | 10 +++++++
>  drivers/gpu/drm/qxl/qxl_drv.c     | 58 +++++++++++++++++++++++++++++++++++++--
>  drivers/gpu/drm/qxl/qxl_drv.h     |  7 ++++-
>  drivers/gpu/drm/qxl/qxl_kms.c     | 40 ++-------------------------
>  drivers/gpu/drm/qxl/qxl_ttm.c     |  8 +-----
>  5 files changed, 75 insertions(+), 48 deletions(-)
> 
> diff --git a/drivers/gpu/drm/qxl/qxl_debugfs.c b/drivers/gpu/drm/qxl/qxl_debugfs.c
> index 241af9131dc8..057b2b547cac 100644
> --- a/drivers/gpu/drm/qxl/qxl_debugfs.c
> +++ b/drivers/gpu/drm/qxl/qxl_debugfs.c
> @@ -84,8 +84,18 @@ int
>  qxl_debugfs_init(struct drm_minor *minor)
>  {
>  #if defined(CONFIG_DEBUG_FS)
> +	int r;
> +	struct qxl_device *dev =
> +		(struct qxl_device *) minor->dev->dev_private;
> +
>  	drm_debugfs_create_files(qxl_debugfs_list, QXL_DEBUGFS_ENTRIES,
>  				 minor->debugfs_root, minor);
> +
> +	r = qxl_ttm_debugfs_init(dev);
> +	if (r) {
> +		DRM_ERROR("Failed to init TTM debugfs\n");
> +		return r;
> +	}
>  #endif
>  	return 0;
>  }
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c
> index 460bbceae297..7cc29027a612 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.c
> +++ b/drivers/gpu/drm/qxl/qxl_drv.c
> @@ -62,12 +62,67 @@ static struct pci_driver qxl_pci_driver;
>  static int
>  qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
>  {
> +	struct drm_device *drm;
> +	struct qxl_device *qdev;
> +	int ret;
> +
>  	if (pdev->revision < 4) {
>  		DRM_ERROR("qxl too old, doesn't support client_monitors_config,"
>  			  " use xf86-video-qxl in user mode");
>  		return -EINVAL; /* TODO: ENODEV ? */
>  	}
> -	return drm_get_pci_dev(pdev, ent, &qxl_driver);
> +
> +	drm = drm_dev_alloc(&qxl_driver, &pdev->dev);
> +	if (IS_ERR(drm))
> +		return -ENOMEM;
> +
> +	qdev = kzalloc(sizeof(struct qxl_device), GFP_KERNEL);
> +	if (!qdev) {
> +		ret = -ENOMEM;
> +		goto free_drm_device;
> +	}
> +
> +	ret = pci_enable_device(pdev);
> +	if (ret)
> +		goto free_drm_device;
> +
> +	drm->pdev = pdev;
> +	pci_set_drvdata(pdev, drm);
> +	drm->dev_private = qdev;
> +
> +	ret = qxl_device_init(qdev, drm, pdev, ent->driver_data);
> +	if (ret)
> +		goto disable_pci;
> +
> +	ret = drm_vblank_init(drm, 1);
> +	if (ret)
> +		goto unload;
> +
> +	ret = qxl_modeset_init(qdev);
> +	if (ret)
> +		goto vblank_cleanup;
> +
> +	drm_kms_helper_poll_init(qdev->ddev);
> +
> +	/* Complete initialization. */
> +	ret = drm_dev_register(drm, ent->driver_data);
> +	if (ret)
> +		goto modeset_cleanup;
> +
> +	return 0;
> +
> +modeset_cleanup:
> +	qxl_modeset_fini(qdev);
> +vblank_cleanup:
> +	drm_vblank_cleanup(drm);
> +unload:
> +	qxl_device_fini(qdev);
> +disable_pci:
> +	pci_disable_device(pdev);
> +free_drm_device:
> +	kfree(qdev);
> +	kfree(drm);
> +	return ret;
>  }
>  
>  static void
> @@ -230,7 +285,6 @@ static struct pci_driver qxl_pci_driver = {
>  static struct drm_driver qxl_driver = {
>  	.driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME |
>  			   DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED,
> -	.load = qxl_driver_load,
>  	.unload = qxl_driver_unload,
>  	.get_vblank_counter = qxl_noop_get_vblank_counter,
>  	.enable_vblank = qxl_noop_enable_vblank,
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 883d8639c04e..d0aed9ed12d2 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -336,7 +336,10 @@ __printf(2,3) void qxl_io_log(struct qxl_device *qdev, const char *fmt, ...);
>  extern const struct drm_ioctl_desc qxl_ioctls[];
>  extern int qxl_max_ioctl;
>  
> -int qxl_driver_load(struct drm_device *dev, unsigned long flags);
> +int qxl_device_init(struct qxl_device *qdev, struct drm_device *ddev,
> +		    struct pci_dev *pdev,  unsigned long flags);
> +void qxl_device_fini(struct qxl_device *qdev);
> +
>  void qxl_driver_unload(struct drm_device *dev);
>  
>  int qxl_modeset_init(struct qxl_device *qdev);
> @@ -345,6 +348,8 @@ void qxl_modeset_fini(struct qxl_device *qdev);
>  int qxl_bo_init(struct qxl_device *qdev);
>  void qxl_bo_fini(struct qxl_device *qdev);
>  
> +int qxl_ttm_debugfs_init(struct qxl_device *qdev);
> +

Please group this declaration together with the other qxl debugfs
declarations.

Gustavo



More information about the dri-devel mailing list