diff options
author | Dave Airlie <airlied@redhat.com> | 2013-11-02 09:32:43 +0000 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2013-11-02 09:32:43 +0000 |
commit | 846d2f4824a72ae21f3df60616959292684e3079 (patch) | |
tree | 4ad80d7d614658c3f99ea832da21ebef33200b83 | |
parent | bc125f96a38664167e65dde0512328ea20af430a (diff) |
qxl: make into a real driverqxl-demidlayer
This attempts to avoid the drm midlayer for the qxl driver,
it embeds drm_device into qxl_device, doesn't use dev_private anymore,
stops using the drm irq handling,
drops a few functions from the drm device struct
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_debugfs.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_display.c | 45 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.c | 103 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_drv.h | 11 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_dumb.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_fb.c | 8 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_ioctl.c | 18 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_irq.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_kms.c | 31 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_object.c | 14 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_object.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_release.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/qxl/qxl_ttm.c | 13 |
13 files changed, 157 insertions, 124 deletions
diff --git a/drivers/gpu/drm/qxl/qxl_debugfs.c b/drivers/gpu/drm/qxl/qxl_debugfs.c index c3c2bbdc6674..47467e41d972 100644 --- a/drivers/gpu/drm/qxl/qxl_debugfs.c +++ b/drivers/gpu/drm/qxl/qxl_debugfs.c @@ -40,7 +40,7 @@ static int qxl_debugfs_irq_received(struct seq_file *m, void *data) { struct drm_info_node *node = (struct drm_info_node *) m->private; - struct qxl_device *qdev = node->minor->dev->dev_private; + struct qxl_device *qdev = to_qxl_device(node->minor->dev); seq_printf(m, "%d\n", atomic_read(&qdev->irq_received)); seq_printf(m, "%d\n", atomic_read(&qdev->irq_received_display)); @@ -54,7 +54,7 @@ static int qxl_debugfs_buffers_info(struct seq_file *m, void *data) { struct drm_info_node *node = (struct drm_info_node *) m->private; - struct qxl_device *qdev = node->minor->dev->dev_private; + struct qxl_device *qdev = to_qxl_device(node->minor->dev); struct qxl_bo *bo; list_for_each_entry(bo, &qdev->gem.objects, list) { @@ -115,11 +115,11 @@ int qxl_debugfs_add_files(struct qxl_device *qdev, qdev->debugfs_count = i; #if defined(CONFIG_DEBUG_FS) drm_debugfs_create_files(files, nfiles, - qdev->ddev->control->debugfs_root, - qdev->ddev->control); + qdev->ddev.control->debugfs_root, + qdev->ddev.control); drm_debugfs_create_files(files, nfiles, - qdev->ddev->primary->debugfs_root, - qdev->ddev->primary); + qdev->ddev.primary->debugfs_root, + qdev->ddev.primary); #endif return 0; } @@ -132,10 +132,10 @@ void qxl_debugfs_remove_files(struct qxl_device *qdev) for (i = 0; i < qdev->debugfs_count; i++) { drm_debugfs_remove_files(qdev->debugfs[i].files, qdev->debugfs[i].num_files, - qdev->ddev->control); + qdev->ddev.control); drm_debugfs_remove_files(qdev->debugfs[i].files, qdev->debugfs[i].num_files, - qdev->ddev->primary); + qdev->ddev.primary); } #endif } diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c index 61974cb9d205..87c7ad3acf45 100644 --- a/drivers/gpu/drm/qxl/qxl_display.c +++ b/drivers/gpu/drm/qxl/qxl_display.c @@ -108,10 +108,10 @@ void qxl_display_read_client_monitors_config(struct qxl_device *qdev) " retrying\n"); } - if (!drm_helper_hpd_irq_event(qdev->ddev)) { + if (!drm_helper_hpd_irq_event(&qdev->ddev)) { /* notify that the monitor configuration changed, to adjust at the arbitrary resolution */ - drm_kms_helper_hotplug_event(qdev->ddev); + drm_kms_helper_hotplug_event(&qdev->ddev); } } @@ -120,7 +120,7 @@ static int qxl_add_monitors_config_modes(struct drm_connector *connector, unsigned *pheight) { struct drm_device *dev = connector->dev; - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); struct qxl_output *output = drm_connector_to_qxl_output(connector); int h = output->index; struct drm_display_mode *mode = NULL; @@ -221,7 +221,7 @@ static int qxl_crtc_cursor_set2(struct drm_crtc *crtc, uint32_t height, int32_t hot_x, int32_t hot_y) { struct drm_device *dev = crtc->dev; - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); struct qxl_crtc *qcrtc = to_qxl_crtc(crtc); struct drm_gem_object *obj; struct qxl_cursor *cursor; @@ -336,7 +336,7 @@ static int qxl_crtc_cursor_move(struct drm_crtc *crtc, int x, int y) { struct drm_device *dev = crtc->dev; - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); struct qxl_crtc *qcrtc = to_qxl_crtc(crtc); struct qxl_release *release; struct qxl_cursor_cmd *cmd; @@ -394,7 +394,7 @@ static int qxl_framebuffer_surface_dirty(struct drm_framebuffer *fb, { /* TODO: vmwgfx where this was cribbed from had locking. Why? */ struct qxl_framebuffer *qxl_fb = to_qxl_framebuffer(fb); - struct qxl_device *qdev = qxl_fb->base.dev->dev_private; + struct qxl_device *qdev = to_qxl_device(qxl_fb->base.dev); struct drm_clip_rect norect; struct qxl_bo *qobj; int inc = 1; @@ -454,7 +454,7 @@ static bool qxl_crtc_mode_fixup(struct drm_crtc *crtc, struct drm_display_mode *adjusted_mode) { struct drm_device *dev = crtc->dev; - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); qxl_io_log(qdev, "%s: (%d,%d) => (%d,%d)\n", __func__, @@ -511,7 +511,7 @@ static int qxl_crtc_mode_set(struct drm_crtc *crtc, struct drm_framebuffer *old_fb) { struct drm_device *dev = crtc->dev; - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); struct qxl_mode *m = (void *)mode->private; struct qxl_framebuffer *qfb; struct qxl_bo *bo, *old_bo = NULL; @@ -601,7 +601,8 @@ static void qxl_crtc_disable(struct drm_crtc *crtc) { struct qxl_crtc *qcrtc = to_qxl_crtc(crtc); struct drm_device *dev = crtc->dev; - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); + if (crtc->fb) { struct qxl_framebuffer *qfb = to_qxl_framebuffer(crtc->fb); struct qxl_bo *bo = gem_to_qxl_bo(qfb->obj); @@ -711,7 +712,7 @@ static void qxl_write_monitors_config_for_encoder(struct qxl_device *qdev, static void qxl_enc_commit(struct drm_encoder *encoder) { - struct qxl_device *qdev = encoder->dev->dev_private; + struct qxl_device *qdev = to_qxl_device(encoder->dev); qxl_write_monitors_config_for_encoder(qdev, encoder); DRM_DEBUG("\n"); @@ -727,7 +728,7 @@ static void qxl_enc_mode_set(struct drm_encoder *encoder, static int qxl_conn_get_modes(struct drm_connector *connector) { int ret = 0; - struct qxl_device *qdev = connector->dev->dev_private; + struct qxl_device *qdev = to_qxl_device(connector->dev); unsigned pwidth = 1024; unsigned pheight = 768; @@ -794,7 +795,7 @@ static enum drm_connector_status qxl_conn_detect( struct qxl_output *output = drm_connector_to_qxl_output(connector); struct drm_device *ddev = connector->dev; - struct qxl_device *qdev = ddev->dev_private; + struct qxl_device *qdev = to_qxl_device(ddev); int connected; /* The first monitor is always connected */ @@ -973,24 +974,24 @@ int qxl_modeset_init(struct qxl_device *qdev) int i; int ret; - drm_mode_config_init(qdev->ddev); + drm_mode_config_init(&qdev->ddev); ret = qxl_create_monitors_object(qdev); if (ret) return ret; - qdev->ddev->mode_config.funcs = (void *)&qxl_mode_funcs; + qdev->ddev.mode_config.funcs = (void *)&qxl_mode_funcs; /* modes will be validated against the framebuffer size */ - qdev->ddev->mode_config.min_width = 320; - qdev->ddev->mode_config.min_height = 200; - qdev->ddev->mode_config.max_width = 8192; - qdev->ddev->mode_config.max_height = 8192; + qdev->ddev.mode_config.min_width = 320; + qdev->ddev.mode_config.min_height = 200; + qdev->ddev.mode_config.max_width = 8192; + qdev->ddev.mode_config.max_height = 8192; - qdev->ddev->mode_config.fb_base = qdev->vram_base; + qdev->ddev.mode_config.fb_base = qdev->vram_base; for (i = 0 ; i < qxl_num_crtc; ++i) { - qdev_crtc_init(qdev->ddev, i); - qdev_output_init(qdev->ddev, i); + qdev_crtc_init(&qdev->ddev, i); + qdev_output_init(&qdev->ddev, i); } qdev->mode_info.mode_config_initialized = true; @@ -1008,7 +1009,7 @@ void qxl_modeset_fini(struct qxl_device *qdev) qxl_destroy_monitors_object(qdev); if (qdev->mode_info.mode_config_initialized) { - drm_mode_config_cleanup(qdev->ddev); + drm_mode_config_cleanup(&qdev->ddev); qdev->mode_info.mode_config_initialized = false; } } diff --git a/drivers/gpu/drm/qxl/qxl_drv.c b/drivers/gpu/drm/qxl/qxl_drv.c index fee8748bdca5..a89d26798967 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.c +++ b/drivers/gpu/drm/qxl/qxl_drv.c @@ -62,20 +62,68 @@ static struct pci_driver qxl_pci_driver; static int qxl_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) { + 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); + + qdev = kzalloc(sizeof(*qdev), GFP_KERNEL); + if (!qdev) + return -ENOMEM; + + ret = drm_dev_init(&qdev->ddev, &qxl_driver, &pdev->dev); + if (ret) + goto err_free; + + ret = pci_enable_device(pdev); + if (ret) + goto err_free; + + qdev->pdev = pdev; + + pci_set_drvdata(pdev, qdev); + + + mutex_lock(&drm_global_mutex); + + ret = drm_register_minors(&qdev->ddev); + if (ret) + goto err_unlock; + + ret = qxl_driver_load(qdev, ent->driver_data); + if (ret) + goto err_unlock; + + /* setup grouping for legacy outputs */ + ret = drm_mode_group_init_legacy_group(&qdev->ddev, + &qdev->ddev.primary->mode_group); + +err_unlock: + mutex_unlock(&drm_global_mutex); + + return ret; +err_pci: + pci_disable_device(pdev); +err_free: + kfree(qdev); + return ret; } static void qxl_pci_remove(struct pci_dev *pdev) { - struct drm_device *dev = pci_get_drvdata(pdev); + struct qxl_device *qdev = pci_get_drvdata(pdev); + struct drm_device *dev = &qdev->ddev; - drm_put_dev(dev); + qxl_driver_unload(qdev); + drm_dev_unregister(dev); + + drm_dev_fini(dev); + kfree(qdev); } static const struct file_operations qxl_fops = { @@ -87,20 +135,19 @@ static const struct file_operations qxl_fops = { .mmap = qxl_mmap, }; -static int qxl_drm_freeze(struct drm_device *dev) +static int qxl_drm_freeze(struct qxl_device *qdev) { - struct pci_dev *pdev = dev->pdev; - struct qxl_device *qdev = dev->dev_private; + struct pci_dev *pdev = qdev->ddev.pdev; struct drm_crtc *crtc; - drm_kms_helper_poll_disable(dev); + drm_kms_helper_poll_disable(&qdev->ddev); console_lock(); qxl_fbdev_set_suspend(qdev, 1); console_unlock(); /* unpin the front buffers */ - list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { + list_for_each_entry(crtc, &qdev->ddev.mode_config.crtc_list, head) { struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; if (crtc->enabled) (*crtc_funcs->disable)(crtc); @@ -119,10 +166,8 @@ static int qxl_drm_freeze(struct drm_device *dev) return 0; } -static int qxl_drm_resume(struct drm_device *dev, bool thaw) +static int qxl_drm_resume(struct qxl_device *qdev, bool thaw) { - struct qxl_device *qdev = dev->dev_private; - qdev->ram_header->int_mask = QXL_INTERRUPT_MASK; if (!thaw) { qxl_reinit_memslots(qdev); @@ -130,23 +175,23 @@ static int qxl_drm_resume(struct drm_device *dev, bool thaw) } qxl_create_monitors_object(qdev); - drm_helper_resume_force_mode(dev); + drm_helper_resume_force_mode(&qdev->ddev); console_lock(); qxl_fbdev_set_suspend(qdev, 0); console_unlock(); - drm_kms_helper_poll_enable(dev); + drm_kms_helper_poll_enable(&qdev->ddev); return 0; } static int qxl_pm_suspend(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct drm_device *drm_dev = pci_get_drvdata(pdev); + struct qxl_device *qdev = pci_get_drvdata(pdev); int error; - error = qxl_drm_freeze(drm_dev); + error = qxl_drm_freeze(qdev); if (error) return error; @@ -158,7 +203,7 @@ static int qxl_pm_suspend(struct device *dev) static int qxl_pm_resume(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct drm_device *drm_dev = pci_get_drvdata(pdev); + struct qxl_device *qdev = pci_get_drvdata(pdev); pci_set_power_state(pdev, PCI_D0); pci_restore_state(pdev); @@ -166,33 +211,32 @@ static int qxl_pm_resume(struct device *dev) return -EIO; } - return qxl_drm_resume(drm_dev, false); + return qxl_drm_resume(qdev, false); } static int qxl_pm_thaw(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct drm_device *drm_dev = pci_get_drvdata(pdev); + struct qxl_device *qdev = pci_get_drvdata(pdev); - return qxl_drm_resume(drm_dev, true); + return qxl_drm_resume(qdev, true); } static int qxl_pm_freeze(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct drm_device *drm_dev = pci_get_drvdata(pdev); + struct qxl_device *qdev = pci_get_drvdata(pdev); - return qxl_drm_freeze(drm_dev); + return qxl_drm_freeze(qdev); } static int qxl_pm_restore(struct device *dev) { struct pci_dev *pdev = to_pci_dev(dev); - struct drm_device *drm_dev = pci_get_drvdata(pdev); - struct qxl_device *qdev = drm_dev->dev_private; + struct qxl_device *qdev = pci_get_drvdata(pdev); qxl_io_reset(qdev); - return qxl_drm_resume(drm_dev, false); + return qxl_drm_resume(qdev, false); } static const struct dev_pm_ops qxl_pm_ops = { @@ -214,9 +258,6 @@ static struct pci_driver qxl_pci_driver = { static struct drm_driver qxl_driver = { .driver_features = DRIVER_GEM | DRIVER_MODESET | DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED, - .dev_priv_size = 0, - .load = qxl_driver_load, - .unload = qxl_driver_unload, .dumb_create = qxl_mode_dumb_create, .dumb_map_offset = qxl_mode_dumb_mmap, @@ -230,7 +271,6 @@ static struct drm_driver qxl_driver = { .gem_close_object = qxl_gem_object_close, .fops = &qxl_fops, .ioctls = qxl_ioctls, - .irq_handler = qxl_irq_handler, .name = DRIVER_NAME, .desc = DRIVER_DESC, .date = DRIVER_DATE, @@ -249,12 +289,15 @@ static int __init qxl_init(void) if (qxl_modeset == 0) return -EINVAL; qxl_driver.num_ioctls = qxl_max_ioctls; - return drm_pci_init(&qxl_driver, &qxl_pci_driver); + + drm_pci_driver_init(&qxl_driver, &qxl_pci_driver); + + return pci_register_driver(&qxl_pci_driver); } static void __exit qxl_exit(void) { - drm_pci_exit(&qxl_driver, &qxl_pci_driver); + pci_unregister_driver(&qxl_pci_driver); } module_init(qxl_init); diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h index 41d22ed26060..c076f6753b1f 100644 --- a/drivers/gpu/drm/qxl/qxl_drv.h +++ b/drivers/gpu/drm/qxl/qxl_drv.h @@ -240,8 +240,9 @@ void qxl_debugfs_remove_files(struct qxl_device *qdev); struct qxl_device; struct qxl_device { + struct drm_device ddev; + struct device *dev; - struct drm_device *ddev; struct pci_dev *pdev; unsigned long flags; @@ -325,14 +326,16 @@ struct qxl_device { struct work_struct fb_work; }; +#define to_qxl_device(x) container_of(x, struct qxl_device, ddev) + /* forward declaration for QXL_INFO_IO */ 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_driver_unload(struct drm_device *dev); +int qxl_driver_load(struct qxl_device *qdev, unsigned long flags); +int qxl_driver_unload(struct qxl_device *qdev); int qxl_modeset_init(struct qxl_device *qdev); void qxl_modeset_fini(struct qxl_device *qdev); @@ -532,7 +535,7 @@ void qxl_debugfs_takedown(struct drm_minor *minor); /* qxl_irq.c */ int qxl_irq_init(struct qxl_device *qdev); -irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS); +int qxl_irq_fini(struct qxl_device *qdev); /* qxl_fb.c */ int qxl_fb_init(struct qxl_device *qdev); diff --git a/drivers/gpu/drm/qxl/qxl_dumb.c b/drivers/gpu/drm/qxl/qxl_dumb.c index d34bb4130ff0..8730c919c900 100644 --- a/drivers/gpu/drm/qxl/qxl_dumb.c +++ b/drivers/gpu/drm/qxl/qxl_dumb.c @@ -32,7 +32,7 @@ int qxl_mode_dumb_create(struct drm_file *file_priv, struct drm_device *dev, struct drm_mode_create_dumb *args) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = to_qxl_device(dev); struct qxl_bo *qobj; uint32_t handle; int r; diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c index 88722f233430..ee2fc98b2ec9 100644 --- a/drivers/gpu/drm/qxl/qxl_fb.c +++ b/drivers/gpu/drm/qxl/qxl_fb.c @@ -544,7 +544,7 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev, info->par = qfbdev; - qxl_framebuffer_init(qdev->ddev, &qfbdev->qfb, &mode_cmd, gobj); + qxl_framebuffer_init(&qdev->ddev, &qfbdev->qfb, &mode_cmd, gobj); fb = &qfbdev->qfb.base; @@ -577,7 +577,7 @@ static int qxlfb_create(struct qxl_fbdev *qfbdev, ret = -ENOMEM; goto out_unref; } - info->apertures->ranges[0].base = qdev->ddev->mode_config.fb_base; + info->apertures->ranges[0].base = qdev->ddev.mode_config.fb_base; info->apertures->ranges[0].size = qdev->vram_size; info->fix.mmio_start = 0; @@ -679,7 +679,7 @@ int qxl_fbdev_init(struct qxl_device *qdev) qfbdev->helper.funcs = &qxl_fb_helper_funcs; spin_lock_init(&qfbdev->delayed_ops_lock); INIT_LIST_HEAD(&qfbdev->delayed_ops); - ret = drm_fb_helper_init(qdev->ddev, &qfbdev->helper, + ret = drm_fb_helper_init(&qdev->ddev, &qfbdev->helper, qxl_num_crtc /* num_crtc - QXL supports just 1 */, QXLFB_CONN_LIMIT); if (ret) { @@ -697,7 +697,7 @@ void qxl_fbdev_fini(struct qxl_device *qdev) if (!qdev->mode_info.qfbdev) return; - qxl_fbdev_destroy(qdev->ddev, qdev->mode_info.qfbdev); + qxl_fbdev_destroy(&qdev->ddev, qdev->mode_info.qfbdev); kfree(qdev->mode_info.qfbdev); qdev->mode_info.qfbdev = NULL; } diff --git a/drivers/gpu/drm/qxl/qxl_ioctl.c b/drivers/gpu/drm/qxl/qxl_ioctl.c index 7b95c75e9626..652b260245e6 100644 --- a/drivers/gpu/drm/qxl/qxl_ioctl.c +++ b/drivers/gpu/drm/qxl/qxl_ioctl.c @@ -33,7 +33,7 @@ static int qxl_alloc_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_alloc *qxl_alloc = data; int ret; struct qxl_bo *qobj; @@ -61,10 +61,10 @@ static int qxl_alloc_ioctl(struct drm_device *dev, void *data, static int qxl_map_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_map *qxl_map = data; - return qxl_mode_dumb_mmap(file_priv, qdev->ddev, qxl_map->handle, + return qxl_mode_dumb_mmap(file_priv, &qdev->ddev, qxl_map->handle, &qxl_map->offset); } @@ -115,7 +115,7 @@ static struct qxl_bo *qxlhw_handle_to_bo(struct qxl_device *qdev, struct qxl_bo *qobj; int ret; - gobj = drm_gem_object_lookup(qdev->ddev, file_priv, handle); + gobj = drm_gem_object_lookup(&qdev->ddev, file_priv, handle); if (!gobj) return NULL; @@ -286,7 +286,7 @@ out_free_reloc: static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_execbuffer *execbuffer = data; struct drm_qxl_command user_cmd; int cmd_num; @@ -311,7 +311,7 @@ static int qxl_execbuffer_ioctl(struct drm_device *dev, void *data, static int qxl_update_area_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_update_area *update_area = data; struct qxl_rect area = {.left = update_area->left, .top = update_area->top, @@ -361,7 +361,7 @@ out: static int qxl_getparam_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_getparam *param = data; switch (param->param) { @@ -380,7 +380,7 @@ static int qxl_getparam_ioctl(struct drm_device *dev, void *data, static int qxl_clientcap_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_clientcap *param = data; int byte, idx; @@ -401,7 +401,7 @@ static int qxl_clientcap_ioctl(struct drm_device *dev, void *data, static int qxl_alloc_surf_ioctl(struct drm_device *dev, void *data, struct drm_file *file) { - struct qxl_device *qdev = dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)dev; struct drm_qxl_alloc_surf *param = data; struct qxl_bo *qobj; int handle; diff --git a/drivers/gpu/drm/qxl/qxl_irq.c b/drivers/gpu/drm/qxl/qxl_irq.c index 21393dc4700a..9d7f4cbd0045 100644 --- a/drivers/gpu/drm/qxl/qxl_irq.c +++ b/drivers/gpu/drm/qxl/qxl_irq.c @@ -27,8 +27,7 @@ irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS) { - struct drm_device *dev = (struct drm_device *) arg; - struct qxl_device *qdev = (struct qxl_device *)dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *) arg; uint32_t pending; pending = xchg(&qdev->ram_header->int_pending, 0); @@ -87,7 +86,10 @@ int qxl_irq_init(struct qxl_device *qdev) atomic_set(&qdev->irq_received_cursor, 0); atomic_set(&qdev->irq_received_io_cmd, 0); qdev->irq_received_error = 0; - ret = drm_irq_install(qdev->ddev); + + ret = request_irq(qdev->ddev.pdev->irq, qxl_irq_handler, + IRQF_SHARED, DRIVER_NAME, qdev); + qdev->ram_header->int_mask = QXL_INTERRUPT_MASK; if (unlikely(ret != 0)) { DRM_ERROR("Failed installing irq: %d\n", ret); @@ -95,3 +97,9 @@ int qxl_irq_init(struct qxl_device *qdev) } return 0; } + +int qxl_irq_fini(struct qxl_device *qdev) +{ + drm_irq_wakeup_waiters(&qdev->ddev); + free_irq(qdev->ddev.pdev->irq, qdev); +} diff --git a/drivers/gpu/drm/qxl/qxl_kms.c b/drivers/gpu/drm/qxl/qxl_kms.c index 9e8da9ee9731..29c27f044ac2 100644 --- a/drivers/gpu/drm/qxl/qxl_kms.c +++ b/drivers/gpu/drm/qxl/qxl_kms.c @@ -123,7 +123,7 @@ int qxl_device_init(struct qxl_device *qdev, int r; qdev->dev = &pdev->dev; - qdev->ddev = ddev; + // qdev->ddev = ddev; qdev->pdev = pdev; qdev->flags = flags; @@ -254,7 +254,7 @@ static void qxl_device_fini(struct qxl_device *qdev) flush_workqueue(qdev->gc_queue); destroy_workqueue(qdev->gc_queue); qdev->gc_queue = NULL; - + qxl_irq_fini(qdev); qxl_ring_free(qdev->command_ring); qxl_ring_free(qdev->cursor_ring); qxl_ring_free(qdev->release_ring); @@ -269,46 +269,29 @@ static void qxl_device_fini(struct qxl_device *qdev) qxl_debugfs_remove_files(qdev); } -int qxl_driver_unload(struct drm_device *dev) +int qxl_driver_unload(struct qxl_device *qdev) { - struct qxl_device *qdev = dev->dev_private; - - if (qdev == NULL) - return 0; qxl_modeset_fini(qdev); qxl_device_fini(qdev); - - kfree(qdev); - dev->dev_private = NULL; return 0; } -int qxl_driver_load(struct drm_device *dev, unsigned long flags) +int qxl_driver_load(struct qxl_device *qdev, unsigned long flags) { - struct qxl_device *qdev; + struct drm_device *dev = &qdev->ddev; int r; - /* require kms */ - if (!drm_core_check_feature(dev, DRIVER_MODESET)) - return -ENODEV; - - qdev = kzalloc(sizeof(struct qxl_device), GFP_KERNEL); - if (qdev == NULL) - return -ENOMEM; - - dev->dev_private = qdev; - r = qxl_device_init(qdev, dev, dev->pdev, flags); if (r) goto out; r = qxl_modeset_init(qdev); if (r) { - qxl_driver_unload(dev); + qxl_driver_unload(qdev); goto out; } - drm_kms_helper_poll_init(qdev->ddev); + drm_kms_helper_poll_init(&qdev->ddev); return 0; out: diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c index 8691c76c5ef0..9169d8703094 100644 --- a/drivers/gpu/drm/qxl/qxl_object.c +++ b/drivers/gpu/drm/qxl/qxl_object.c @@ -33,7 +33,7 @@ static void qxl_ttm_bo_destroy(struct ttm_buffer_object *tbo) struct qxl_device *qdev; bo = container_of(tbo, struct qxl_bo, tbo); - qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; + qdev = (struct qxl_device *)bo->gem_base.dev; qxl_surface_evict(qdev, bo, false); qxl_fence_fini(&bo->fence); @@ -83,7 +83,7 @@ int qxl_bo_create(struct qxl_device *qdev, int r; if (unlikely(qdev->mman.bdev.dev_mapping == NULL)) - qdev->mman.bdev.dev_mapping = qdev->ddev->dev_mapping; + qdev->mman.bdev.dev_mapping = qdev->ddev.dev_mapping; if (kernel) type = ttm_bo_type_kernel; else @@ -93,7 +93,7 @@ int qxl_bo_create(struct qxl_device *qdev, if (bo == NULL) return -ENOMEM; size = roundup(size, PAGE_SIZE); - r = drm_gem_object_init(qdev->ddev, &bo->gem_base, size); + r = drm_gem_object_init(&qdev->ddev, &bo->gem_base, size); if (unlikely(r)) { kfree(bo); return r; @@ -227,7 +227,7 @@ struct qxl_bo *qxl_bo_ref(struct qxl_bo *bo) int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) { - struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev; int r; if (bo->pin_count) { @@ -250,7 +250,7 @@ int qxl_bo_pin(struct qxl_bo *bo, u32 domain, u64 *gpu_addr) int qxl_bo_unpin(struct qxl_bo *bo) { - struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; + struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev; int r, i; if (!bo->pin_count) { @@ -276,7 +276,7 @@ void qxl_bo_force_delete(struct qxl_device *qdev) return; dev_err(qdev->dev, "Userspace still has active objects !\n"); list_for_each_entry_safe(bo, n, &qdev->gem.objects, list) { - mutex_lock(&qdev->ddev->struct_mutex); + mutex_lock(&qdev->ddev.struct_mutex); dev_err(qdev->dev, "%p %p %lu %lu force free\n", &bo->gem_base, bo, (unsigned long)bo->gem_base.size, *((unsigned long *)&bo->gem_base.refcount)); @@ -285,7 +285,7 @@ void qxl_bo_force_delete(struct qxl_device *qdev) mutex_unlock(&qdev->gem.mutex); /* this should unref the ttm bo */ drm_gem_object_unreference(&bo->gem_base); - mutex_unlock(&qdev->ddev->struct_mutex); + mutex_unlock(&qdev->ddev.struct_mutex); } } diff --git a/drivers/gpu/drm/qxl/qxl_object.h b/drivers/gpu/drm/qxl/qxl_object.h index d458a140c024..df69a10e1484 100644 --- a/drivers/gpu/drm/qxl/qxl_object.h +++ b/drivers/gpu/drm/qxl/qxl_object.h @@ -34,7 +34,7 @@ static inline int qxl_bo_reserve(struct qxl_bo *bo, bool no_wait) r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); if (unlikely(r != 0)) { if (r != -ERESTARTSYS) { - struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; + struct qxl_device *qdev = to_qxl_device(bo->gem_base.dev); dev_err(qdev->dev, "%p reserve failed\n", bo); } return r; @@ -70,7 +70,7 @@ static inline int qxl_bo_wait(struct qxl_bo *bo, u32 *mem_type, r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, 0); if (unlikely(r != 0)) { if (r != -ERESTARTSYS) { - struct qxl_device *qdev = (struct qxl_device *)bo->gem_base.dev->dev_private; + struct qxl_device *qdev = to_qxl_device(bo->gem_base.dev); dev_err(qdev->dev, "%p reserve failed for wait\n", bo); } diff --git a/drivers/gpu/drm/qxl/qxl_release.c b/drivers/gpu/drm/qxl/qxl_release.c index 0109a9644cb2..053134b873df 100644 --- a/drivers/gpu/drm/qxl/qxl_release.c +++ b/drivers/gpu/drm/qxl/qxl_release.c @@ -142,7 +142,7 @@ static int qxl_release_validate_bo(struct qxl_bo *bo) } /* allocate a surface for reserved + validated buffers */ - ret = qxl_bo_check_id(bo->gem_base.dev->dev_private, bo); + ret = qxl_bo_check_id(to_qxl_device(bo->gem_base.dev), bo); if (ret) return ret; return 0; diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c index 037786d7c1dc..faadaf30f38e 100644 --- a/drivers/gpu/drm/qxl/qxl_ttm.c +++ b/drivers/gpu/drm/qxl/qxl_ttm.c @@ -133,12 +133,7 @@ int qxl_mmap(struct file *filp, struct vm_area_struct *vma) } file_priv = filp->private_data; - qdev = file_priv->minor->dev->dev_private; - if (qdev == NULL) { - DRM_ERROR( - "filp->private_data->minor->dev->dev_private == NULL\n"); - return -EINVAL; - } + qdev = file_priv->minor->dev; QXL_INFO(qdev, "%s: filp->private_data = 0x%p, vma->vm_pgoff = %lx\n", __func__, filp->private_data, vma->vm_pgoff); @@ -455,7 +450,7 @@ static void qxl_bo_move_notify(struct ttm_buffer_object *bo, if (!qxl_ttm_bo_is_qxl_bo(bo)) return; qbo = container_of(bo, struct qxl_bo, tbo); - qdev = qbo->gem_base.dev->dev_private; + qdev = to_qxl_device(qbo->gem_base.dev); if (bo->mem.mem_type == TTM_PL_PRIV0 && qbo->surface_id) qxl_surface_evict(qdev, qbo, new_mem ? true : false); @@ -517,7 +512,7 @@ int qxl_ttm_init(struct qxl_device *qdev) DRM_INFO("qxl: %luM of IO pages memory ready (VRAM domain)\n", ((unsigned)num_io_pages * PAGE_SIZE) / (1024 * 1024)); if (unlikely(qdev->mman.bdev.dev_mapping == NULL)) - qdev->mman.bdev.dev_mapping = qdev->ddev->dev_mapping; + qdev->mman.bdev.dev_mapping = qdev->ddev.dev_mapping; r = qxl_ttm_debugfs_init(qdev); if (r) { DRM_ERROR("Failed to init debugfs\n"); @@ -544,7 +539,7 @@ static int qxl_mm_dump_table(struct seq_file *m, void *data) struct drm_info_node *node = (struct drm_info_node *)m->private; struct drm_mm *mm = (struct drm_mm *)node->info_ent->data; struct drm_device *dev = node->minor->dev; - struct qxl_device *rdev = dev->dev_private; + struct qxl_device *rdev = to_qxl_device(dev); int ret; struct ttm_bo_global *glob = rdev->mman.bdev.glob; |