[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