summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2013-11-02 09:32:43 +0000
committerDave Airlie <airlied@redhat.com>2013-11-02 09:32:43 +0000
commit846d2f4824a72ae21f3df60616959292684e3079 (patch)
tree4ad80d7d614658c3f99ea832da21ebef33200b83
parentbc125f96a38664167e65dde0512328ea20af430a (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.c16
-rw-r--r--drivers/gpu/drm/qxl/qxl_display.c45
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.c103
-rw-r--r--drivers/gpu/drm/qxl/qxl_drv.h11
-rw-r--r--drivers/gpu/drm/qxl/qxl_dumb.c2
-rw-r--r--drivers/gpu/drm/qxl/qxl_fb.c8
-rw-r--r--drivers/gpu/drm/qxl/qxl_ioctl.c18
-rw-r--r--drivers/gpu/drm/qxl/qxl_irq.c14
-rw-r--r--drivers/gpu/drm/qxl/qxl_kms.c31
-rw-r--r--drivers/gpu/drm/qxl/qxl_object.c14
-rw-r--r--drivers/gpu/drm/qxl/qxl_object.h4
-rw-r--r--drivers/gpu/drm/qxl/qxl_release.c2
-rw-r--r--drivers/gpu/drm/qxl/qxl_ttm.c13
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;