diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 19:46:44 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-02-25 19:46:44 -0500 |
commit | fffddfd6c8e0c10c42c6e2cc54ba880fcc36ebbb (patch) | |
tree | 71bc5e597124dbaf7550f1e089d675718b3ed5c0 /drivers/gpu/drm/nouveau/nouveau_drm.c | |
parent | 69086a78bdc973ec0b722be790b146e84ba8a8c4 (diff) | |
parent | be88298b0a3f771a4802f20c5e66af74bfd1dff1 (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.c | 60 |
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 | ||
52 | MODULE_PARM_DESC(config, "option string to pass to driver core"); | 55 | MODULE_PARM_DESC(config, "option string to pass to driver core"); |
53 | static char *nouveau_config; | 56 | static char *nouveau_config; |
@@ -68,6 +71,32 @@ module_param_named(modeset, nouveau_modeset, int, 0400); | |||
68 | 71 | ||
69 | static struct drm_driver driver; | 72 | static struct drm_driver driver; |
70 | 73 | ||
74 | static int | ||
75 | nouveau_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 | |||
83 | static void | ||
84 | nouveau_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 | |||
91 | static int | ||
92 | nouveau_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 | |||
71 | static u64 | 100 | static u64 |
72 | nouveau_name(struct pci_dev *pdev) | 101 | nouveau_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 | ||
404 | int | 435 | static int |
405 | nouveau_do_suspend(struct drm_device *dev) | 436 | nouveau_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 | ||
475 | int | 506 | static int |
476 | nouveau_do_resume(struct drm_device *dev) | 507 | nouveau_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, |