aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_drm.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2013-02-25 19:46:44 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2013-02-25 19:46:44 -0500
commitfffddfd6c8e0c10c42c6e2cc54ba880fcc36ebbb (patch)
tree71bc5e597124dbaf7550f1e089d675718b3ed5c0 /drivers/gpu/drm/nouveau/nouveau_drm.c
parent69086a78bdc973ec0b722be790b146e84ba8a8c4 (diff)
parentbe88298b0a3f771a4802f20c5e66af74bfd1dff1 (diff)
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm merge from Dave Airlie: "Highlights: - TI LCD controller KMS driver - TI OMAP KMS driver merged from staging - drop gma500 stub driver - the fbcon locking fixes - the vgacon dirty like zebra fix. - open firmware videomode and hdmi common code helpers - major locking rework for kms object handling - pageflip/cursor won't block on polling anymore! - fbcon helper and prime helper cleanups - i915: all over the map, haswell power well enhancements, valleyview macro horrors cleaned up, killing lots of legacy GTT code, - radeon: CS ioctl unification, deprecated UMS support, gpu reset rework, VM fixes - nouveau: reworked thermal code, external dp/tmds encoder support (anx9805), fences sleep instead of polling, - exynos: all over the driver fixes." Lovely conflict in radeon/evergreen_cs.c between commit de0babd60d8d ("drm/radeon: enforce use of radeon_get_ib_value when reading user cmd") and the new changes that modified that evergreen_dma_cs_parse() function. * 'drm-next' of git://people.freedesktop.org/~airlied/linux: (508 commits) drm/tilcdc: only build on arm drm/i915: Revert hdmi HDP pin checks drm/tegra: Add list of framebuffers to debugfs drm/tegra: Fix color expansion drm/tegra: Split DC_CMD_STATE_CONTROL register write drm/tegra: Implement page-flipping support drm/tegra: Implement VBLANK support drm/tegra: Implement .mode_set_base() drm/tegra: Add plane support drm/tegra: Remove bogus tegra_framebuffer structure drm: Add consistency check for page-flipping drm/radeon: Use generic HDMI infoframe helpers drm/tegra: Use generic HDMI infoframe helpers drm: Add EDID helper documentation drm: Add HDMI infoframe helpers video: Add generic HDMI infoframe helpers drm: Add some missing forward declarations drm: Move mode tables to drm_edid.c drm: Remove duplicate drm_mode_cea_vic() gma500: Fix n, m1 and m2 clock limits for sdvo and lvds ...
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_drm.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_drm.c60
1 files changed, 51 insertions, 9 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index 5e7aef23825a..d1099365bfc1 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -34,6 +34,8 @@
34#include <subdev/device.h> 34#include <subdev/device.h>
35#include <subdev/vm.h> 35#include <subdev/vm.h>
36 36
37#include <engine/disp.h>
38
37#include "nouveau_drm.h" 39#include "nouveau_drm.h"
38#include "nouveau_irq.h" 40#include "nouveau_irq.h"
39#include "nouveau_dma.h" 41#include "nouveau_dma.h"
@@ -48,6 +50,7 @@
48#include "nouveau_abi16.h" 50#include "nouveau_abi16.h"
49#include "nouveau_fbcon.h" 51#include "nouveau_fbcon.h"
50#include "nouveau_fence.h" 52#include "nouveau_fence.h"
53#include "nouveau_debugfs.h"
51 54
52MODULE_PARM_DESC(config, "option string to pass to driver core"); 55MODULE_PARM_DESC(config, "option string to pass to driver core");
53static char *nouveau_config; 56static char *nouveau_config;
@@ -68,6 +71,32 @@ module_param_named(modeset, nouveau_modeset, int, 0400);
68 71
69static struct drm_driver driver; 72static struct drm_driver driver;
70 73
74static int
75nouveau_drm_vblank_enable(struct drm_device *dev, int head)
76{
77 struct nouveau_drm *drm = nouveau_drm(dev);
78 struct nouveau_disp *pdisp = nouveau_disp(drm->device);
79 nouveau_event_get(pdisp->vblank, head, &drm->vblank);
80 return 0;
81}
82
83static void
84nouveau_drm_vblank_disable(struct drm_device *dev, int head)
85{
86 struct nouveau_drm *drm = nouveau_drm(dev);
87 struct nouveau_disp *pdisp = nouveau_disp(drm->device);
88 nouveau_event_put(pdisp->vblank, head, &drm->vblank);
89}
90
91static int
92nouveau_drm_vblank_handler(struct nouveau_eventh *event, int head)
93{
94 struct nouveau_drm *drm =
95 container_of(event, struct nouveau_drm, vblank);
96 drm_handle_vblank(drm->dev, head);
97 return NVKM_EVENT_KEEP;
98}
99
71static u64 100static u64
72nouveau_name(struct pci_dev *pdev) 101nouveau_name(struct pci_dev *pdev)
73{ 102{
@@ -132,7 +161,8 @@ nouveau_accel_init(struct nouveau_drm *drm)
132 161
133 /* initialise synchronisation routines */ 162 /* initialise synchronisation routines */
134 if (device->card_type < NV_10) ret = nv04_fence_create(drm); 163 if (device->card_type < NV_10) ret = nv04_fence_create(drm);
135 else if (device->card_type < NV_50) ret = nv10_fence_create(drm); 164 else if (device->chipset < 0x17) ret = nv10_fence_create(drm);
165 else if (device->card_type < NV_50) ret = nv17_fence_create(drm);
136 else if (device->chipset < 0x84) ret = nv50_fence_create(drm); 166 else if (device->chipset < 0x84) ret = nv50_fence_create(drm);
137 else if (device->card_type < NV_C0) ret = nv84_fence_create(drm); 167 else if (device->card_type < NV_C0) ret = nv84_fence_create(drm);
138 else ret = nvc0_fence_create(drm); 168 else ret = nvc0_fence_create(drm);
@@ -262,6 +292,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
262 292
263 dev->dev_private = drm; 293 dev->dev_private = drm;
264 drm->dev = dev; 294 drm->dev = dev;
295 drm->vblank.func = nouveau_drm_vblank_handler;
265 296
266 INIT_LIST_HEAD(&drm->clients); 297 INIT_LIST_HEAD(&drm->clients);
267 spin_lock_init(&drm->tile.lock); 298 spin_lock_init(&drm->tile.lock);
@@ -401,7 +432,7 @@ nouveau_drm_remove(struct pci_dev *pdev)
401 nouveau_object_debug(); 432 nouveau_object_debug();
402} 433}
403 434
404int 435static int
405nouveau_do_suspend(struct drm_device *dev) 436nouveau_do_suspend(struct drm_device *dev)
406{ 437{
407 struct nouveau_drm *drm = nouveau_drm(dev); 438 struct nouveau_drm *drm = nouveau_drm(dev);
@@ -472,7 +503,7 @@ int nouveau_pmops_suspend(struct device *dev)
472 return 0; 503 return 0;
473} 504}
474 505
475int 506static int
476nouveau_do_resume(struct drm_device *dev) 507nouveau_do_resume(struct drm_device *dev)
477{ 508{
478 struct nouveau_drm *drm = nouveau_drm(dev); 509 struct nouveau_drm *drm = nouveau_drm(dev);
@@ -546,10 +577,11 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
546 struct pci_dev *pdev = dev->pdev; 577 struct pci_dev *pdev = dev->pdev;
547 struct nouveau_drm *drm = nouveau_drm(dev); 578 struct nouveau_drm *drm = nouveau_drm(dev);
548 struct nouveau_cli *cli; 579 struct nouveau_cli *cli;
549 char name[16]; 580 char name[32], tmpname[TASK_COMM_LEN];
550 int ret; 581 int ret;
551 582
552 snprintf(name, sizeof(name), "%d", pid_nr(fpriv->pid)); 583 get_task_comm(tmpname, current);
584 snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid));
553 585
554 ret = nouveau_cli_create(pdev, name, sizeof(*cli), (void **)&cli); 586 ret = nouveau_cli_create(pdev, name, sizeof(*cli), (void **)&cli);
555 if (ret) 587 if (ret)
@@ -639,22 +671,32 @@ driver = {
639 .postclose = nouveau_drm_postclose, 671 .postclose = nouveau_drm_postclose,
640 .lastclose = nouveau_vga_lastclose, 672 .lastclose = nouveau_vga_lastclose,
641 673
674#if defined(CONFIG_DEBUG_FS)
675 .debugfs_init = nouveau_debugfs_init,
676 .debugfs_cleanup = nouveau_debugfs_takedown,
677#endif
678
642 .irq_preinstall = nouveau_irq_preinstall, 679 .irq_preinstall = nouveau_irq_preinstall,
643 .irq_postinstall = nouveau_irq_postinstall, 680 .irq_postinstall = nouveau_irq_postinstall,
644 .irq_uninstall = nouveau_irq_uninstall, 681 .irq_uninstall = nouveau_irq_uninstall,
645 .irq_handler = nouveau_irq_handler, 682 .irq_handler = nouveau_irq_handler,
646 683
647 .get_vblank_counter = drm_vblank_count, 684 .get_vblank_counter = drm_vblank_count,
648 .enable_vblank = nouveau_vblank_enable, 685 .enable_vblank = nouveau_drm_vblank_enable,
649 .disable_vblank = nouveau_vblank_disable, 686 .disable_vblank = nouveau_drm_vblank_disable,
650 687
651 .ioctls = nouveau_ioctls, 688 .ioctls = nouveau_ioctls,
652 .fops = &nouveau_driver_fops, 689 .fops = &nouveau_driver_fops,
653 690
654 .prime_handle_to_fd = drm_gem_prime_handle_to_fd, 691 .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
655 .prime_fd_to_handle = drm_gem_prime_fd_to_handle, 692 .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
656 .gem_prime_export = nouveau_gem_prime_export, 693 .gem_prime_export = drm_gem_prime_export,
657 .gem_prime_import = nouveau_gem_prime_import, 694 .gem_prime_import = drm_gem_prime_import,
695 .gem_prime_pin = nouveau_gem_prime_pin,
696 .gem_prime_get_sg_table = nouveau_gem_prime_get_sg_table,
697 .gem_prime_import_sg_table = nouveau_gem_prime_import_sg_table,
698 .gem_prime_vmap = nouveau_gem_prime_vmap,
699 .gem_prime_vunmap = nouveau_gem_prime_vunmap,
658 700
659 .gem_init_object = nouveau_gem_object_new, 701 .gem_init_object = nouveau_gem_object_new,
660 .gem_free_object = nouveau_gem_object_del, 702 .gem_free_object = nouveau_gem_object_del,