Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1/*
   2 * Copyright 2012 Red Hat Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 * Authors: Ben Skeggs
  23 */
  24
  25#include <linux/console.h>
  26#include <linux/delay.h>
  27#include <linux/module.h>
  28#include <linux/pci.h>
  29#include <linux/pm_runtime.h>
  30#include <linux/vga_switcheroo.h>
  31
  32#include "drmP.h"
  33#include "drm_crtc_helper.h"
  34
  35#include <core/gpuobj.h>
  36#include <core/option.h>
  37#include <core/pci.h>
  38#include <core/tegra.h>
  39
  40#include <nvif/class.h>
  41#include <nvif/cl0002.h>
  42#include <nvif/cla06f.h>
  43#include <nvif/if0004.h>
  44
  45#include "nouveau_drv.h"
  46#include "nouveau_dma.h"
  47#include "nouveau_ttm.h"
  48#include "nouveau_gem.h"
  49#include "nouveau_vga.h"
  50#include "nouveau_led.h"
  51#include "nouveau_hwmon.h"
  52#include "nouveau_acpi.h"
  53#include "nouveau_bios.h"
  54#include "nouveau_ioctl.h"
  55#include "nouveau_abi16.h"
  56#include "nouveau_fbcon.h"
  57#include "nouveau_fence.h"
  58#include "nouveau_debugfs.h"
  59#include "nouveau_usif.h"
  60#include "nouveau_connector.h"
  61#include "nouveau_platform.h"
  62
  63MODULE_PARM_DESC(config, "option string to pass to driver core");
  64static char *nouveau_config;
  65module_param_named(config, nouveau_config, charp, 0400);
  66
  67MODULE_PARM_DESC(debug, "debug string to pass to driver core");
  68static char *nouveau_debug;
  69module_param_named(debug, nouveau_debug, charp, 0400);
  70
  71MODULE_PARM_DESC(noaccel, "disable kernel/abi16 acceleration");
  72static int nouveau_noaccel = 0;
  73module_param_named(noaccel, nouveau_noaccel, int, 0400);
  74
  75MODULE_PARM_DESC(modeset, "enable driver (default: auto, "
  76		          "0 = disabled, 1 = enabled, 2 = headless)");
  77int nouveau_modeset = -1;
  78module_param_named(modeset, nouveau_modeset, int, 0400);
  79
  80MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)");
  81int nouveau_runtime_pm = -1;
  82module_param_named(runpm, nouveau_runtime_pm, int, 0400);
  83
  84static struct drm_driver driver_stub;
  85static struct drm_driver driver_pci;
  86static struct drm_driver driver_platform;
  87
  88static u64
  89nouveau_pci_name(struct pci_dev *pdev)
  90{
  91	u64 name = (u64)pci_domain_nr(pdev->bus) << 32;
  92	name |= pdev->bus->number << 16;
  93	name |= PCI_SLOT(pdev->devfn) << 8;
  94	return name | PCI_FUNC(pdev->devfn);
  95}
  96
  97static u64
  98nouveau_platform_name(struct platform_device *platformdev)
  99{
 100	return platformdev->id;
 101}
 102
 103static u64
 104nouveau_name(struct drm_device *dev)
 105{
 106	if (dev->pdev)
 107		return nouveau_pci_name(dev->pdev);
 108	else
 109		return nouveau_platform_name(dev->platformdev);
 110}
 111
 112static int
 113nouveau_cli_create(struct drm_device *dev, const char *sname,
 114		   int size, void **pcli)
 115{
 116	struct nouveau_cli *cli = *pcli = kzalloc(size, GFP_KERNEL);
 117	int ret;
 118	if (cli) {
 119		snprintf(cli->name, sizeof(cli->name), "%s", sname);
 120		cli->dev = dev;
 121
 122		ret = nvif_client_init(NULL, cli->name, nouveau_name(dev),
 123				       nouveau_config, nouveau_debug,
 124				       &cli->base);
 125		if (ret == 0) {
 126			mutex_init(&cli->mutex);
 127			usif_client_init(cli);
 128		}
 129		return ret;
 130	}
 131	return -ENOMEM;
 132}
 133
 134static void
 135nouveau_cli_destroy(struct nouveau_cli *cli)
 136{
 137	nvkm_vm_ref(NULL, &nvxx_client(&cli->base)->vm, NULL);
 138	nvif_client_fini(&cli->base);
 139	usif_client_fini(cli);
 140	kfree(cli);
 141}
 142
 143static void
 144nouveau_accel_fini(struct nouveau_drm *drm)
 145{
 146	nouveau_channel_idle(drm->channel);
 147	nvif_object_fini(&drm->ntfy);
 148	nvkm_gpuobj_del(&drm->notify);
 149	nvif_notify_fini(&drm->flip);
 150	nvif_object_fini(&drm->nvsw);
 151	nouveau_channel_del(&drm->channel);
 152
 153	nouveau_channel_idle(drm->cechan);
 154	nvif_object_fini(&drm->ttm.copy);
 155	nouveau_channel_del(&drm->cechan);
 156
 157	if (drm->fence)
 158		nouveau_fence(drm)->dtor(drm);
 159}
 160
 161static void
 162nouveau_accel_init(struct nouveau_drm *drm)
 163{
 164	struct nvif_device *device = &drm->device;
 165	struct nvif_sclass *sclass;
 166	u32 arg0, arg1;
 167	int ret, i, n;
 168
 169	if (nouveau_noaccel)
 170		return;
 171
 172	/* initialise synchronisation routines */
 173	/*XXX: this is crap, but the fence/channel stuff is a little
 174	 *     backwards in some places.  this will be fixed.
 175	 */
 176	ret = n = nvif_object_sclass_get(&device->object, &sclass);
 177	if (ret < 0)
 178		return;
 179
 180	for (ret = -ENOSYS, i = 0; i < n; i++) {
 181		switch (sclass[i].oclass) {
 182		case NV03_CHANNEL_DMA:
 183			ret = nv04_fence_create(drm);
 184			break;
 185		case NV10_CHANNEL_DMA:
 186			ret = nv10_fence_create(drm);
 187			break;
 188		case NV17_CHANNEL_DMA:
 189		case NV40_CHANNEL_DMA:
 190			ret = nv17_fence_create(drm);
 191			break;
 192		case NV50_CHANNEL_GPFIFO:
 193			ret = nv50_fence_create(drm);
 194			break;
 195		case G82_CHANNEL_GPFIFO:
 196			ret = nv84_fence_create(drm);
 197			break;
 198		case FERMI_CHANNEL_GPFIFO:
 199		case KEPLER_CHANNEL_GPFIFO_A:
 200		case KEPLER_CHANNEL_GPFIFO_B:
 201		case MAXWELL_CHANNEL_GPFIFO_A:
 202		case PASCAL_CHANNEL_GPFIFO_A:
 203			ret = nvc0_fence_create(drm);
 204			break;
 205		default:
 206			break;
 207		}
 208	}
 209
 210	nvif_object_sclass_put(&sclass);
 211	if (ret) {
 212		NV_ERROR(drm, "failed to initialise sync subsystem, %d\n", ret);
 213		nouveau_accel_fini(drm);
 214		return;
 215	}
 216
 217	if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) {
 218		ret = nouveau_channel_new(drm, &drm->device,
 219					  NVA06F_V0_ENGINE_CE0 |
 220					  NVA06F_V0_ENGINE_CE1,
 221					  0, &drm->cechan);
 222		if (ret)
 223			NV_ERROR(drm, "failed to create ce channel, %d\n", ret);
 224
 225		arg0 = NVA06F_V0_ENGINE_GR;
 226		arg1 = 1;
 227	} else
 228	if (device->info.chipset >= 0xa3 &&
 229	    device->info.chipset != 0xaa &&
 230	    device->info.chipset != 0xac) {
 231		ret = nouveau_channel_new(drm, &drm->device,
 232					  NvDmaFB, NvDmaTT, &drm->cechan);
 233		if (ret)
 234			NV_ERROR(drm, "failed to create ce channel, %d\n", ret);
 235
 236		arg0 = NvDmaFB;
 237		arg1 = NvDmaTT;
 238	} else {
 239		arg0 = NvDmaFB;
 240		arg1 = NvDmaTT;
 241	}
 242
 243	ret = nouveau_channel_new(drm, &drm->device, arg0, arg1, &drm->channel);
 244	if (ret) {
 245		NV_ERROR(drm, "failed to create kernel channel, %d\n", ret);
 246		nouveau_accel_fini(drm);
 247		return;
 248	}
 249
 250	ret = nvif_object_init(&drm->channel->user, NVDRM_NVSW,
 251			       nouveau_abi16_swclass(drm), NULL, 0, &drm->nvsw);
 252	if (ret == 0) {
 253		ret = RING_SPACE(drm->channel, 2);
 254		if (ret == 0) {
 255			if (device->info.family < NV_DEVICE_INFO_V0_FERMI) {
 256				BEGIN_NV04(drm->channel, NvSubSw, 0, 1);
 257				OUT_RING  (drm->channel, NVDRM_NVSW);
 258			} else
 259			if (device->info.family < NV_DEVICE_INFO_V0_KEPLER) {
 260				BEGIN_NVC0(drm->channel, FermiSw, 0, 1);
 261				OUT_RING  (drm->channel, 0x001f0000);
 262			}
 263		}
 264
 265		ret = nvif_notify_init(&drm->nvsw, nouveau_flip_complete,
 266				       false, NV04_NVSW_NTFY_UEVENT,
 267				       NULL, 0, 0, &drm->flip);
 268		if (ret == 0)
 269			ret = nvif_notify_get(&drm->flip);
 270		if (ret) {
 271			nouveau_accel_fini(drm);
 272			return;
 273		}
 274	}
 275
 276	if (ret) {
 277		NV_ERROR(drm, "failed to allocate software object, %d\n", ret);
 278		nouveau_accel_fini(drm);
 279		return;
 280	}
 281
 282	if (device->info.family < NV_DEVICE_INFO_V0_FERMI) {
 283		ret = nvkm_gpuobj_new(nvxx_device(&drm->device), 32, 0, false,
 284				      NULL, &drm->notify);
 285		if (ret) {
 286			NV_ERROR(drm, "failed to allocate notifier, %d\n", ret);
 287			nouveau_accel_fini(drm);
 288			return;
 289		}
 290
 291		ret = nvif_object_init(&drm->channel->user, NvNotify0,
 292				       NV_DMA_IN_MEMORY,
 293				       &(struct nv_dma_v0) {
 294						.target = NV_DMA_V0_TARGET_VRAM,
 295						.access = NV_DMA_V0_ACCESS_RDWR,
 296						.start = drm->notify->addr,
 297						.limit = drm->notify->addr + 31
 298				       }, sizeof(struct nv_dma_v0),
 299				       &drm->ntfy);
 300		if (ret) {
 301			nouveau_accel_fini(drm);
 302			return;
 303		}
 304	}
 305
 306
 307	nouveau_bo_move_init(drm);
 308}
 309
 310static int nouveau_drm_probe(struct pci_dev *pdev,
 311			     const struct pci_device_id *pent)
 312{
 313	struct nvkm_device *device;
 314	struct apertures_struct *aper;
 315	bool boot = false;
 316	int ret;
 317
 318	if (vga_switcheroo_client_probe_defer(pdev))
 319		return -EPROBE_DEFER;
 320
 321	/* We need to check that the chipset is supported before booting
 322	 * fbdev off the hardware, as there's no way to put it back.
 323	 */
 324	ret = nvkm_device_pci_new(pdev, NULL, "error", true, false, 0, &device);
 325	if (ret)
 326		return ret;
 327
 328	nvkm_device_del(&device);
 329
 330	/* Remove conflicting drivers (vesafb, efifb etc). */
 331	aper = alloc_apertures(3);
 332	if (!aper)
 333		return -ENOMEM;
 334
 335	aper->ranges[0].base = pci_resource_start(pdev, 1);
 336	aper->ranges[0].size = pci_resource_len(pdev, 1);
 337	aper->count = 1;
 338
 339	if (pci_resource_len(pdev, 2)) {
 340		aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
 341		aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
 342		aper->count++;
 343	}
 344
 345	if (pci_resource_len(pdev, 3)) {
 346		aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
 347		aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
 348		aper->count++;
 349	}
 350
 351#ifdef CONFIG_X86
 352	boot = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
 353#endif
 354	if (nouveau_modeset != 2)
 355		drm_fb_helper_remove_conflicting_framebuffers(aper, "nouveaufb", boot);
 356	kfree(aper);
 357
 358	ret = nvkm_device_pci_new(pdev, nouveau_config, nouveau_debug,
 359				  true, true, ~0ULL, &device);
 360	if (ret)
 361		return ret;
 362
 363	pci_set_master(pdev);
 364
 365	ret = drm_get_pci_dev(pdev, pent, &driver_pci);
 366	if (ret) {
 367		nvkm_device_del(&device);
 368		return ret;
 369	}
 370
 371	return 0;
 372}
 373
 374#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403
 375
 376static void
 377nouveau_get_hdmi_dev(struct nouveau_drm *drm)
 378{
 379	struct pci_dev *pdev = drm->dev->pdev;
 380
 381	if (!pdev) {
 382		NV_DEBUG(drm, "not a PCI device; no HDMI\n");
 383		drm->hdmi_device = NULL;
 384		return;
 385	}
 386
 387	/* subfunction one is a hdmi audio device? */
 388	drm->hdmi_device = pci_get_bus_and_slot((unsigned int)pdev->bus->number,
 389						PCI_DEVFN(PCI_SLOT(pdev->devfn), 1));
 390
 391	if (!drm->hdmi_device) {
 392		NV_DEBUG(drm, "hdmi device not found %d %d %d\n", pdev->bus->number, PCI_SLOT(pdev->devfn), 1);
 393		return;
 394	}
 395
 396	if ((drm->hdmi_device->class >> 8) != PCI_CLASS_MULTIMEDIA_HD_AUDIO) {
 397		NV_DEBUG(drm, "possible hdmi device not audio %d\n", drm->hdmi_device->class);
 398		pci_dev_put(drm->hdmi_device);
 399		drm->hdmi_device = NULL;
 400		return;
 401	}
 402}
 403
 404static int
 405nouveau_drm_load(struct drm_device *dev, unsigned long flags)
 406{
 407	struct nouveau_drm *drm;
 408	int ret;
 409
 410	ret = nouveau_cli_create(dev, "DRM", sizeof(*drm), (void **)&drm);
 411	if (ret)
 412		return ret;
 413
 414	dev->dev_private = drm;
 415	drm->dev = dev;
 416	nvxx_client(&drm->client.base)->debug =
 417		nvkm_dbgopt(nouveau_debug, "DRM");
 418
 419	INIT_LIST_HEAD(&drm->clients);
 420	spin_lock_init(&drm->tile.lock);
 421
 422	nouveau_get_hdmi_dev(drm);
 423
 424	ret = nvif_device_init(&drm->client.base.object, 0, NV_DEVICE,
 425			       &(struct nv_device_v0) {
 426					.device = ~0,
 427			       }, sizeof(struct nv_device_v0),
 428			       &drm->device);
 429	if (ret)
 430		goto fail_device;
 431
 432	dev->irq_enabled = true;
 433
 434	/* workaround an odd issue on nvc1 by disabling the device's
 435	 * nosnoop capability.  hopefully won't cause issues until a
 436	 * better fix is found - assuming there is one...
 437	 */
 438	if (drm->device.info.chipset == 0xc1)
 439		nvif_mask(&drm->device.object, 0x00088080, 0x00000800, 0x00000000);
 440
 441	nouveau_vga_init(drm);
 442
 443	if (drm->device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
 444		if (!nvxx_device(&drm->device)->mmu) {
 445			ret = -ENOSYS;
 446			goto fail_device;
 447		}
 448
 449		ret = nvkm_vm_new(nvxx_device(&drm->device), 0, (1ULL << 40),
 450				  0x1000, NULL, &drm->client.vm);
 451		if (ret)
 452			goto fail_device;
 453
 454		nvxx_client(&drm->client.base)->vm = drm->client.vm;
 455	}
 456
 457	ret = nouveau_ttm_init(drm);
 458	if (ret)
 459		goto fail_ttm;
 460
 461	ret = nouveau_bios_init(dev);
 462	if (ret)
 463		goto fail_bios;
 464
 465	ret = nouveau_display_create(dev);
 466	if (ret)
 467		goto fail_dispctor;
 468
 469	if (dev->mode_config.num_crtc) {
 470		ret = nouveau_display_init(dev);
 471		if (ret)
 472			goto fail_dispinit;
 473	}
 474
 475	nouveau_debugfs_init(drm);
 476	nouveau_hwmon_init(dev);
 477	nouveau_accel_init(drm);
 478	nouveau_fbcon_init(dev);
 479	nouveau_led_init(dev);
 480
 481	if (nouveau_runtime_pm != 0) {
 482		pm_runtime_use_autosuspend(dev->dev);
 483		pm_runtime_set_autosuspend_delay(dev->dev, 5000);
 484		pm_runtime_set_active(dev->dev);
 485		pm_runtime_allow(dev->dev);
 486		pm_runtime_mark_last_busy(dev->dev);
 487		pm_runtime_put(dev->dev);
 488	}
 489	return 0;
 490
 491fail_dispinit:
 492	nouveau_display_destroy(dev);
 493fail_dispctor:
 494	nouveau_bios_takedown(dev);
 495fail_bios:
 496	nouveau_ttm_fini(drm);
 497fail_ttm:
 498	nouveau_vga_fini(drm);
 499fail_device:
 500	nvif_device_fini(&drm->device);
 501	nouveau_cli_destroy(&drm->client);
 502	return ret;
 503}
 504
 505static int
 506nouveau_drm_unload(struct drm_device *dev)
 507{
 508	struct nouveau_drm *drm = nouveau_drm(dev);
 509
 510	if (nouveau_runtime_pm != 0) {
 511		pm_runtime_get_sync(dev->dev);
 512		pm_runtime_forbid(dev->dev);
 513	}
 514
 515	nouveau_led_fini(dev);
 516	nouveau_fbcon_fini(dev);
 517	nouveau_accel_fini(drm);
 518	nouveau_hwmon_fini(dev);
 519	nouveau_debugfs_fini(drm);
 520
 521	if (dev->mode_config.num_crtc)
 522		nouveau_display_fini(dev, false);
 523	nouveau_display_destroy(dev);
 524
 525	nouveau_bios_takedown(dev);
 526
 527	nouveau_ttm_fini(drm);
 528	nouveau_vga_fini(drm);
 529
 530	nvif_device_fini(&drm->device);
 531	if (drm->hdmi_device)
 532		pci_dev_put(drm->hdmi_device);
 533	nouveau_cli_destroy(&drm->client);
 534	return 0;
 535}
 536
 537void
 538nouveau_drm_device_remove(struct drm_device *dev)
 539{
 540	struct nouveau_drm *drm = nouveau_drm(dev);
 541	struct nvkm_client *client;
 542	struct nvkm_device *device;
 543
 544	dev->irq_enabled = false;
 545	client = nvxx_client(&drm->client.base);
 546	device = nvkm_device_find(client->device);
 547	drm_put_dev(dev);
 548
 549	nvkm_device_del(&device);
 550}
 551
 552static void
 553nouveau_drm_remove(struct pci_dev *pdev)
 554{
 555	struct drm_device *dev = pci_get_drvdata(pdev);
 556
 557	nouveau_drm_device_remove(dev);
 558}
 559
 560static int
 561nouveau_do_suspend(struct drm_device *dev, bool runtime)
 562{
 563	struct nouveau_drm *drm = nouveau_drm(dev);
 564	struct nouveau_cli *cli;
 565	int ret;
 566
 567	nouveau_led_suspend(dev);
 568
 569	if (dev->mode_config.num_crtc) {
 570		NV_INFO(drm, "suspending console...\n");
 571		nouveau_fbcon_set_suspend(dev, 1);
 572		NV_INFO(drm, "suspending display...\n");
 573		ret = nouveau_display_suspend(dev, runtime);
 574		if (ret)
 575			return ret;
 576	}
 577
 578	NV_INFO(drm, "evicting buffers...\n");
 579	ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM);
 580
 581	NV_INFO(drm, "waiting for kernel channels to go idle...\n");
 582	if (drm->cechan) {
 583		ret = nouveau_channel_idle(drm->cechan);
 584		if (ret)
 585			goto fail_display;
 586	}
 587
 588	if (drm->channel) {
 589		ret = nouveau_channel_idle(drm->channel);
 590		if (ret)
 591			goto fail_display;
 592	}
 593
 594	NV_INFO(drm, "suspending client object trees...\n");
 595	if (drm->fence && nouveau_fence(drm)->suspend) {
 596		if (!nouveau_fence(drm)->suspend(drm)) {
 597			ret = -ENOMEM;
 598			goto fail_display;
 599		}
 600	}
 601
 602	list_for_each_entry(cli, &drm->clients, head) {
 603		ret = nvif_client_suspend(&cli->base);
 604		if (ret)
 605			goto fail_client;
 606	}
 607
 608	NV_INFO(drm, "suspending kernel object tree...\n");
 609	ret = nvif_client_suspend(&drm->client.base);
 610	if (ret)
 611		goto fail_client;
 612
 613	return 0;
 614
 615fail_client:
 616	list_for_each_entry_continue_reverse(cli, &drm->clients, head) {
 617		nvif_client_resume(&cli->base);
 618	}
 619
 620	if (drm->fence && nouveau_fence(drm)->resume)
 621		nouveau_fence(drm)->resume(drm);
 622
 623fail_display:
 624	if (dev->mode_config.num_crtc) {
 625		NV_INFO(drm, "resuming display...\n");
 626		nouveau_display_resume(dev, runtime);
 627	}
 628	return ret;
 629}
 630
 631static int
 632nouveau_do_resume(struct drm_device *dev, bool runtime)
 633{
 634	struct nouveau_drm *drm = nouveau_drm(dev);
 635	struct nouveau_cli *cli;
 636
 637	NV_INFO(drm, "resuming kernel object tree...\n");
 638	nvif_client_resume(&drm->client.base);
 639
 640	NV_INFO(drm, "resuming client object trees...\n");
 641	if (drm->fence && nouveau_fence(drm)->resume)
 642		nouveau_fence(drm)->resume(drm);
 643
 644	list_for_each_entry(cli, &drm->clients, head) {
 645		nvif_client_resume(&cli->base);
 646	}
 647
 648	nouveau_run_vbios_init(dev);
 649
 650	if (dev->mode_config.num_crtc) {
 651		NV_INFO(drm, "resuming display...\n");
 652		nouveau_display_resume(dev, runtime);
 653		NV_INFO(drm, "resuming console...\n");
 654		nouveau_fbcon_set_suspend(dev, 0);
 655	}
 656
 657	nouveau_led_resume(dev);
 658
 659	return 0;
 660}
 661
 662int
 663nouveau_pmops_suspend(struct device *dev)
 664{
 665	struct pci_dev *pdev = to_pci_dev(dev);
 666	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 667	int ret;
 668
 669	if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
 670	    drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
 671		return 0;
 672
 673	ret = nouveau_do_suspend(drm_dev, false);
 674	if (ret)
 675		return ret;
 676
 677	pci_save_state(pdev);
 678	pci_disable_device(pdev);
 679	pci_set_power_state(pdev, PCI_D3hot);
 680	udelay(200);
 681	return 0;
 682}
 683
 684int
 685nouveau_pmops_resume(struct device *dev)
 686{
 687	struct pci_dev *pdev = to_pci_dev(dev);
 688	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 689	int ret;
 690
 691	if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
 692	    drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
 693		return 0;
 694
 695	pci_set_power_state(pdev, PCI_D0);
 696	pci_restore_state(pdev);
 697	ret = pci_enable_device(pdev);
 698	if (ret)
 699		return ret;
 700	pci_set_master(pdev);
 701
 702	ret = nouveau_do_resume(drm_dev, false);
 703
 704	/* Monitors may have been connected / disconnected during suspend */
 705	schedule_work(&nouveau_drm(drm_dev)->hpd_work);
 706
 707	return ret;
 708}
 709
 710static int
 711nouveau_pmops_freeze(struct device *dev)
 712{
 713	struct pci_dev *pdev = to_pci_dev(dev);
 714	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 715	return nouveau_do_suspend(drm_dev, false);
 716}
 717
 718static int
 719nouveau_pmops_thaw(struct device *dev)
 720{
 721	struct pci_dev *pdev = to_pci_dev(dev);
 722	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 723	return nouveau_do_resume(drm_dev, false);
 724}
 725
 726static int
 727nouveau_pmops_runtime_suspend(struct device *dev)
 728{
 729	struct pci_dev *pdev = to_pci_dev(dev);
 730	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 731	int ret;
 732
 733	if (nouveau_runtime_pm == 0) {
 734		pm_runtime_forbid(dev);
 735		return -EBUSY;
 736	}
 737
 738	/* are we optimus enabled? */
 739	if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
 740		DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
 741		pm_runtime_forbid(dev);
 742		return -EBUSY;
 743	}
 744
 745	drm_kms_helper_poll_disable(drm_dev);
 746	vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
 747	nouveau_switcheroo_optimus_dsm();
 748	ret = nouveau_do_suspend(drm_dev, true);
 749	pci_save_state(pdev);
 750	pci_disable_device(pdev);
 751	pci_ignore_hotplug(pdev);
 752	pci_set_power_state(pdev, PCI_D3cold);
 753	drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
 754	return ret;
 755}
 756
 757static int
 758nouveau_pmops_runtime_resume(struct device *dev)
 759{
 760	struct pci_dev *pdev = to_pci_dev(dev);
 761	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 762	struct nvif_device *device = &nouveau_drm(drm_dev)->device;
 763	int ret;
 764
 765	if (nouveau_runtime_pm == 0)
 766		return -EINVAL;
 767
 768	pci_set_power_state(pdev, PCI_D0);
 769	pci_restore_state(pdev);
 770	ret = pci_enable_device(pdev);
 771	if (ret)
 772		return ret;
 773	pci_set_master(pdev);
 774
 775	ret = nouveau_do_resume(drm_dev, true);
 776
 777	if (!drm_dev->mode_config.poll_enabled)
 778		drm_kms_helper_poll_enable(drm_dev);
 779
 780	/* do magic */
 781	nvif_mask(&device->object, 0x088488, (1 << 25), (1 << 25));
 782	vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
 783	drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
 784
 785	/* Monitors may have been connected / disconnected during suspend */
 786	schedule_work(&nouveau_drm(drm_dev)->hpd_work);
 787
 788	return ret;
 789}
 790
 791static int
 792nouveau_pmops_runtime_idle(struct device *dev)
 793{
 794	struct pci_dev *pdev = to_pci_dev(dev);
 795	struct drm_device *drm_dev = pci_get_drvdata(pdev);
 796	struct nouveau_drm *drm = nouveau_drm(drm_dev);
 797	struct drm_crtc *crtc;
 798
 799	if (nouveau_runtime_pm == 0) {
 800		pm_runtime_forbid(dev);
 801		return -EBUSY;
 802	}
 803
 804	/* are we optimus enabled? */
 805	if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
 806		DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
 807		pm_runtime_forbid(dev);
 808		return -EBUSY;
 809	}
 810
 811	/* if we have a hdmi audio device - make sure it has a driver loaded */
 812	if (drm->hdmi_device) {
 813		if (!drm->hdmi_device->driver) {
 814			DRM_DEBUG_DRIVER("failing to power off - no HDMI audio driver loaded\n");
 815			pm_runtime_mark_last_busy(dev);
 816			return -EBUSY;
 817		}
 818	}
 819
 820	list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
 821		if (crtc->enabled) {
 822			DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
 823			return -EBUSY;
 824		}
 825	}
 826	pm_runtime_mark_last_busy(dev);
 827	pm_runtime_autosuspend(dev);
 828	/* we don't want the main rpm_idle to call suspend - we want to autosuspend */
 829	return 1;
 830}
 831
 832static int
 833nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
 834{
 835	struct nouveau_drm *drm = nouveau_drm(dev);
 836	struct nouveau_cli *cli;
 837	char name[32], tmpname[TASK_COMM_LEN];
 838	int ret;
 839
 840	/* need to bring up power immediately if opening device */
 841	ret = pm_runtime_get_sync(dev->dev);
 842	if (ret < 0 && ret != -EACCES)
 843		return ret;
 844
 845	get_task_comm(tmpname, current);
 846	snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid));
 847
 848	ret = nouveau_cli_create(dev, name, sizeof(*cli), (void **)&cli);
 849
 850	if (ret)
 851		goto out_suspend;
 852
 853	cli->base.super = false;
 854
 855	if (drm->device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
 856		ret = nvkm_vm_new(nvxx_device(&drm->device), 0, (1ULL << 40),
 857				  0x1000, NULL, &cli->vm);
 858		if (ret) {
 859			nouveau_cli_destroy(cli);
 860			goto out_suspend;
 861		}
 862
 863		nvxx_client(&cli->base)->vm = cli->vm;
 864	}
 865
 866	fpriv->driver_priv = cli;
 867
 868	mutex_lock(&drm->client.mutex);
 869	list_add(&cli->head, &drm->clients);
 870	mutex_unlock(&drm->client.mutex);
 871
 872out_suspend:
 873	pm_runtime_mark_last_busy(dev->dev);
 874	pm_runtime_put_autosuspend(dev->dev);
 875
 876	return ret;
 877}
 878
 879static void
 880nouveau_drm_preclose(struct drm_device *dev, struct drm_file *fpriv)
 881{
 882	struct nouveau_cli *cli = nouveau_cli(fpriv);
 883	struct nouveau_drm *drm = nouveau_drm(dev);
 884
 885	pm_runtime_get_sync(dev->dev);
 886
 887	mutex_lock(&cli->mutex);
 888	if (cli->abi16)
 889		nouveau_abi16_fini(cli->abi16);
 890	mutex_unlock(&cli->mutex);
 891
 892	mutex_lock(&drm->client.mutex);
 893	list_del(&cli->head);
 894	mutex_unlock(&drm->client.mutex);
 895
 896}
 897
 898static void
 899nouveau_drm_postclose(struct drm_device *dev, struct drm_file *fpriv)
 900{
 901	struct nouveau_cli *cli = nouveau_cli(fpriv);
 902	nouveau_cli_destroy(cli);
 903	pm_runtime_mark_last_busy(dev->dev);
 904	pm_runtime_put_autosuspend(dev->dev);
 905}
 906
 907static const struct drm_ioctl_desc
 908nouveau_ioctls[] = {
 909	DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_abi16_ioctl_getparam, DRM_AUTH|DRM_RENDER_ALLOW),
 910	DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_abi16_ioctl_setparam, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 911	DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_abi16_ioctl_channel_alloc, DRM_AUTH|DRM_RENDER_ALLOW),
 912	DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_abi16_ioctl_channel_free, DRM_AUTH|DRM_RENDER_ALLOW),
 913	DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_abi16_ioctl_grobj_alloc, DRM_AUTH|DRM_RENDER_ALLOW),
 914	DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_abi16_ioctl_notifierobj_alloc, DRM_AUTH|DRM_RENDER_ALLOW),
 915	DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_abi16_ioctl_gpuobj_free, DRM_AUTH|DRM_RENDER_ALLOW),
 916	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_AUTH|DRM_RENDER_ALLOW),
 917	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_AUTH|DRM_RENDER_ALLOW),
 918	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_AUTH|DRM_RENDER_ALLOW),
 919	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_AUTH|DRM_RENDER_ALLOW),
 920	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_AUTH|DRM_RENDER_ALLOW),
 921};
 922
 923long
 924nouveau_drm_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
 925{
 926	struct drm_file *filp = file->private_data;
 927	struct drm_device *dev = filp->minor->dev;
 928	long ret;
 929
 930	ret = pm_runtime_get_sync(dev->dev);
 931	if (ret < 0 && ret != -EACCES)
 932		return ret;
 933
 934	switch (_IOC_NR(cmd) - DRM_COMMAND_BASE) {
 935	case DRM_NOUVEAU_NVIF:
 936		ret = usif_ioctl(filp, (void __user *)arg, _IOC_SIZE(cmd));
 937		break;
 938	default:
 939		ret = drm_ioctl(file, cmd, arg);
 940		break;
 941	}
 942
 943	pm_runtime_mark_last_busy(dev->dev);
 944	pm_runtime_put_autosuspend(dev->dev);
 945	return ret;
 946}
 947
 948static const struct file_operations
 949nouveau_driver_fops = {
 950	.owner = THIS_MODULE,
 951	.open = drm_open,
 952	.release = drm_release,
 953	.unlocked_ioctl = nouveau_drm_ioctl,
 954	.mmap = nouveau_ttm_mmap,
 955	.poll = drm_poll,
 956	.read = drm_read,
 957#if defined(CONFIG_COMPAT)
 958	.compat_ioctl = nouveau_compat_ioctl,
 959#endif
 960	.llseek = noop_llseek,
 961};
 962
 963static struct drm_driver
 964driver_stub = {
 965	.driver_features =
 966		DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER |
 967		DRIVER_KMS_LEGACY_CONTEXT,
 968
 969	.load = nouveau_drm_load,
 970	.unload = nouveau_drm_unload,
 971	.open = nouveau_drm_open,
 972	.preclose = nouveau_drm_preclose,
 973	.postclose = nouveau_drm_postclose,
 974	.lastclose = nouveau_vga_lastclose,
 975
 976#if defined(CONFIG_DEBUG_FS)
 977	.debugfs_init = nouveau_drm_debugfs_init,
 978	.debugfs_cleanup = nouveau_drm_debugfs_cleanup,
 979#endif
 980
 981	.get_vblank_counter = drm_vblank_no_hw_counter,
 982	.enable_vblank = nouveau_display_vblank_enable,
 983	.disable_vblank = nouveau_display_vblank_disable,
 984	.get_scanout_position = nouveau_display_scanoutpos,
 985	.get_vblank_timestamp = nouveau_display_vblstamp,
 986
 987	.ioctls = nouveau_ioctls,
 988	.num_ioctls = ARRAY_SIZE(nouveau_ioctls),
 989	.fops = &nouveau_driver_fops,
 990
 991	.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
 992	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
 993	.gem_prime_export = drm_gem_prime_export,
 994	.gem_prime_import = drm_gem_prime_import,
 995	.gem_prime_pin = nouveau_gem_prime_pin,
 996	.gem_prime_res_obj = nouveau_gem_prime_res_obj,
 997	.gem_prime_unpin = nouveau_gem_prime_unpin,
 998	.gem_prime_get_sg_table = nouveau_gem_prime_get_sg_table,
 999	.gem_prime_import_sg_table = nouveau_gem_prime_import_sg_table,
1000	.gem_prime_vmap = nouveau_gem_prime_vmap,
1001	.gem_prime_vunmap = nouveau_gem_prime_vunmap,
1002
1003	.gem_free_object_unlocked = nouveau_gem_object_del,
1004	.gem_open_object = nouveau_gem_object_open,
1005	.gem_close_object = nouveau_gem_object_close,
1006
1007	.dumb_create = nouveau_display_dumb_create,
1008	.dumb_map_offset = nouveau_display_dumb_map_offset,
1009	.dumb_destroy = drm_gem_dumb_destroy,
1010
1011	.name = DRIVER_NAME,
1012	.desc = DRIVER_DESC,
1013#ifdef GIT_REVISION
1014	.date = GIT_REVISION,
1015#else
1016	.date = DRIVER_DATE,
1017#endif
1018	.major = DRIVER_MAJOR,
1019	.minor = DRIVER_MINOR,
1020	.patchlevel = DRIVER_PATCHLEVEL,
1021};
1022
1023static struct pci_device_id
1024nouveau_drm_pci_table[] = {
1025	{
1026		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
1027		.class = PCI_BASE_CLASS_DISPLAY << 16,
1028		.class_mask  = 0xff << 16,
1029	},
1030	{
1031		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA_SGS, PCI_ANY_ID),
1032		.class = PCI_BASE_CLASS_DISPLAY << 16,
1033		.class_mask  = 0xff << 16,
1034	},
1035	{}
1036};
1037
1038static void nouveau_display_options(void)
1039{
1040	DRM_DEBUG_DRIVER("Loading Nouveau with parameters:\n");
1041
1042	DRM_DEBUG_DRIVER("... tv_disable   : %d\n", nouveau_tv_disable);
1043	DRM_DEBUG_DRIVER("... ignorelid    : %d\n", nouveau_ignorelid);
1044	DRM_DEBUG_DRIVER("... duallink     : %d\n", nouveau_duallink);
1045	DRM_DEBUG_DRIVER("... nofbaccel    : %d\n", nouveau_nofbaccel);
1046	DRM_DEBUG_DRIVER("... config       : %s\n", nouveau_config);
1047	DRM_DEBUG_DRIVER("... debug        : %s\n", nouveau_debug);
1048	DRM_DEBUG_DRIVER("... noaccel      : %d\n", nouveau_noaccel);
1049	DRM_DEBUG_DRIVER("... modeset      : %d\n", nouveau_modeset);
1050	DRM_DEBUG_DRIVER("... runpm        : %d\n", nouveau_runtime_pm);
1051	DRM_DEBUG_DRIVER("... vram_pushbuf : %d\n", nouveau_vram_pushbuf);
1052	DRM_DEBUG_DRIVER("... hdmimhz      : %d\n", nouveau_hdmimhz);
1053}
1054
1055static const struct dev_pm_ops nouveau_pm_ops = {
1056	.suspend = nouveau_pmops_suspend,
1057	.resume = nouveau_pmops_resume,
1058	.freeze = nouveau_pmops_freeze,
1059	.thaw = nouveau_pmops_thaw,
1060	.poweroff = nouveau_pmops_freeze,
1061	.restore = nouveau_pmops_resume,
1062	.runtime_suspend = nouveau_pmops_runtime_suspend,
1063	.runtime_resume = nouveau_pmops_runtime_resume,
1064	.runtime_idle = nouveau_pmops_runtime_idle,
1065};
1066
1067static struct pci_driver
1068nouveau_drm_pci_driver = {
1069	.name = "nouveau",
1070	.id_table = nouveau_drm_pci_table,
1071	.probe = nouveau_drm_probe,
1072	.remove = nouveau_drm_remove,
1073	.driver.pm = &nouveau_pm_ops,
1074};
1075
1076struct drm_device *
1077nouveau_platform_device_create(const struct nvkm_device_tegra_func *func,
1078			       struct platform_device *pdev,
1079			       struct nvkm_device **pdevice)
1080{
1081	struct drm_device *drm;
1082	int err;
1083
1084	err = nvkm_device_tegra_new(func, pdev, nouveau_config, nouveau_debug,
1085				    true, true, ~0ULL, pdevice);
1086	if (err)
1087		goto err_free;
1088
1089	drm = drm_dev_alloc(&driver_platform, &pdev->dev);
1090	if (IS_ERR(drm)) {
1091		err = PTR_ERR(drm);
1092		goto err_free;
1093	}
1094
1095	drm->platformdev = pdev;
1096	platform_set_drvdata(pdev, drm);
1097
1098	return drm;
1099
1100err_free:
1101	nvkm_device_del(pdevice);
1102
1103	return ERR_PTR(err);
1104}
1105
1106static int __init
1107nouveau_drm_init(void)
1108{
1109	driver_pci = driver_stub;
1110	driver_pci.set_busid = drm_pci_set_busid;
1111	driver_platform = driver_stub;
1112
1113	nouveau_display_options();
1114
1115	if (nouveau_modeset == -1) {
1116		if (vgacon_text_force())
1117			nouveau_modeset = 0;
1118	}
1119
1120	if (!nouveau_modeset)
1121		return 0;
1122
1123#ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
1124	platform_driver_register(&nouveau_platform_driver);
1125#endif
1126
1127	nouveau_register_dsm_handler();
1128	nouveau_backlight_ctor();
1129	return drm_pci_init(&driver_pci, &nouveau_drm_pci_driver);
1130}
1131
1132static void __exit
1133nouveau_drm_exit(void)
1134{
1135	if (!nouveau_modeset)
1136		return;
1137
1138	drm_pci_exit(&driver_pci, &nouveau_drm_pci_driver);
1139	nouveau_backlight_dtor();
1140	nouveau_unregister_dsm_handler();
1141
1142#ifdef CONFIG_NOUVEAU_PLATFORM_DRIVER
1143	platform_driver_unregister(&nouveau_platform_driver);
1144#endif
1145}
1146
1147module_init(nouveau_drm_init);
1148module_exit(nouveau_drm_exit);
1149
1150MODULE_DEVICE_TABLE(pci, nouveau_drm_pci_table);
1151MODULE_AUTHOR(DRIVER_AUTHOR);
1152MODULE_DESCRIPTION(DRIVER_DESC);
1153MODULE_LICENSE("GPL and additional rights");