nouveau_drm.c 27.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * Copyright 2012 Red Hat Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 * Authors: Ben Skeggs
 */

25
#include <linux/console.h>
26 27
#include <linux/module.h>
#include <linux/pci.h>
28 29
#include <linux/pm_runtime.h>
#include <linux/vga_switcheroo.h>
30

31 32
#include "drmP.h"
#include "drm_crtc_helper.h"
33

34
#include <core/device.h>
35
#include <core/gpuobj.h>
36
#include <core/class.h>
37
#include <core/option.h>
38 39

#include "nouveau_drm.h"
40
#include "nouveau_dma.h"
41 42
#include "nouveau_ttm.h"
#include "nouveau_gem.h"
43
#include "nouveau_agp.h"
44
#include "nouveau_vga.h"
45
#include "nouveau_sysfs.h"
46
#include "nouveau_hwmon.h"
47 48 49
#include "nouveau_acpi.h"
#include "nouveau_bios.h"
#include "nouveau_ioctl.h"
50 51 52
#include "nouveau_abi16.h"
#include "nouveau_fbcon.h"
#include "nouveau_fence.h"
53
#include "nouveau_debugfs.h"
54

55 56 57 58 59 60 61 62
MODULE_PARM_DESC(config, "option string to pass to driver core");
static char *nouveau_config;
module_param_named(config, nouveau_config, charp, 0400);

MODULE_PARM_DESC(debug, "debug string to pass to driver core");
static char *nouveau_debug;
module_param_named(debug, nouveau_debug, charp, 0400);

63 64 65 66
MODULE_PARM_DESC(noaccel, "disable kernel/abi16 acceleration");
static int nouveau_noaccel = 0;
module_param_named(noaccel, nouveau_noaccel, int, 0400);

67 68 69
MODULE_PARM_DESC(modeset, "enable driver (default: auto, "
		          "0 = disabled, 1 = enabled, 2 = headless)");
int nouveau_modeset = -1;
70 71
module_param_named(modeset, nouveau_modeset, int, 0400);

72 73 74 75
MODULE_PARM_DESC(runpm, "disable (0), force enable (1), optimus only default (-1)");
int nouveau_runtime_pm = -1;
module_param_named(runpm, nouveau_runtime_pm, int, 0400);

76 77
static struct drm_driver driver;

78
static u64
A
Alexandre Courbot 已提交
79
nouveau_pci_name(struct pci_dev *pdev)
80 81 82 83 84 85 86
{
	u64 name = (u64)pci_domain_nr(pdev->bus) << 32;
	name |= pdev->bus->number << 16;
	name |= PCI_SLOT(pdev->devfn) << 8;
	return name | PCI_FUNC(pdev->devfn);
}

A
Alexandre Courbot 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
static u64
nouveau_platform_name(struct platform_device *platformdev)
{
	return platformdev->id;
}

static u64
nouveau_name(struct drm_device *dev)
{
	if (dev->pdev)
		return nouveau_pci_name(dev->pdev);
	else
		return nouveau_platform_name(dev->platformdev);
}

102
static int
A
Alexandre Courbot 已提交
103
nouveau_cli_create(u64 name, const char *sname,
104
		   int size, void **pcli)
105
{
106 107 108 109 110 111 112
	struct nouveau_cli *cli = *pcli = kzalloc(size, GFP_KERNEL);
	if (cli) {
		int ret = nvif_client_init(NULL, NULL, sname, name,
					   nouveau_config, nouveau_debug,
					  &cli->base);
		if (ret == 0)
			mutex_init(&cli->mutex);
113
		return ret;
114
	}
115
	return -ENOMEM;
116 117 118 119 120
}

static void
nouveau_cli_destroy(struct nouveau_cli *cli)
{
121 122
	nouveau_vm_ref(NULL, &nvkm_client(&cli->base)->vm, NULL);
	nvif_client_fini(&cli->base);
123 124
}

125 126 127 128
static void
nouveau_accel_fini(struct nouveau_drm *drm)
{
	nouveau_channel_del(&drm->channel);
129 130 131
	nvif_object_fini(&drm->ntfy);
	nouveau_gpuobj_ref(NULL, &drm->notify);
	nvif_object_fini(&drm->nvsw);
132
	nouveau_channel_del(&drm->cechan);
133
	nvif_object_fini(&drm->ttm.copy);
134 135 136 137 138 139 140
	if (drm->fence)
		nouveau_fence(drm)->dtor(drm);
}

static void
nouveau_accel_init(struct nouveau_drm *drm)
{
141
	struct nvif_device *device = &drm->device;
142
	u32 arg0, arg1;
143 144
	u32 sclass[16];
	int ret, i;
145

146
	if (nouveau_noaccel)
147 148 149
		return;

	/* initialise synchronisation routines */
150 151 152
	/*XXX: this is crap, but the fence/channel stuff is a little
	 *     backwards in some places.  this will be fixed.
	 */
153
	ret = nvif_object_sclass(&device->base, sclass, ARRAY_SIZE(sclass));
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183
	if (ret < 0)
		return;

	for (ret = -ENOSYS, i = 0; ret && i < ARRAY_SIZE(sclass); i++) {
		switch (sclass[i]) {
		case NV03_CHANNEL_DMA_CLASS:
			ret = nv04_fence_create(drm);
			break;
		case NV10_CHANNEL_DMA_CLASS:
			ret = nv10_fence_create(drm);
			break;
		case NV17_CHANNEL_DMA_CLASS:
		case NV40_CHANNEL_DMA_CLASS:
			ret = nv17_fence_create(drm);
			break;
		case NV50_CHANNEL_IND_CLASS:
			ret = nv50_fence_create(drm);
			break;
		case NV84_CHANNEL_IND_CLASS:
			ret = nv84_fence_create(drm);
			break;
		case NVC0_CHANNEL_IND_CLASS:
		case NVE0_CHANNEL_IND_CLASS:
			ret = nvc0_fence_create(drm);
			break;
		default:
			break;
		}
	}

184 185 186 187 188 189
	if (ret) {
		NV_ERROR(drm, "failed to initialise sync subsystem, %d\n", ret);
		nouveau_accel_fini(drm);
		return;
	}

190
	if (device->info.family >= NV_DEVICE_INFO_V0_KEPLER) {
191
		ret = nouveau_channel_new(drm, &drm->device, NVDRM_CHAN + 1,
192 193 194 195 196 197 198
					  NVE0_CHANNEL_IND_ENGINE_CE0 |
					  NVE0_CHANNEL_IND_ENGINE_CE1, 0,
					  &drm->cechan);
		if (ret)
			NV_ERROR(drm, "failed to create ce channel, %d\n", ret);

		arg0 = NVE0_CHANNEL_IND_ENGINE_GR;
199
		arg1 = 1;
200
	} else
201 202 203
	if (device->info.chipset >= 0xa3 &&
	    device->info.chipset != 0xaa &&
	    device->info.chipset != 0xac) {
204 205
		ret = nouveau_channel_new(drm, &drm->device, NVDRM_CHAN + 1,
					  NvDmaFB, NvDmaTT, &drm->cechan);
206 207 208 209 210
		if (ret)
			NV_ERROR(drm, "failed to create ce channel, %d\n", ret);

		arg0 = NvDmaFB;
		arg1 = NvDmaTT;
211 212 213 214 215
	} else {
		arg0 = NvDmaFB;
		arg1 = NvDmaTT;
	}

216 217
	ret = nouveau_channel_new(drm, &drm->device, NVDRM_CHAN, arg0, arg1,
				 &drm->channel);
218 219 220 221 222 223
	if (ret) {
		NV_ERROR(drm, "failed to create kernel channel, %d\n", ret);
		nouveau_accel_fini(drm);
		return;
	}

224 225
	ret = nvif_object_init(drm->channel->object, NULL, NVDRM_NVSW,
			       nouveau_abi16_swclass(drm), NULL, 0, &drm->nvsw);
226
	if (ret == 0) {
227
		struct nouveau_software_chan *swch;
228 229
		ret = RING_SPACE(drm->channel, 2);
		if (ret == 0) {
230
			if (device->info.family < NV_DEVICE_INFO_V0_FERMI) {
231 232 233
				BEGIN_NV04(drm->channel, NvSubSw, 0, 1);
				OUT_RING  (drm->channel, NVDRM_NVSW);
			} else
234
			if (device->info.family < NV_DEVICE_INFO_V0_KEPLER) {
235 236 237 238
				BEGIN_NVC0(drm->channel, FermiSw, 0, 1);
				OUT_RING  (drm->channel, 0x001f0000);
			}
		}
239
		swch = (void *)nvkm_object(&drm->nvsw)->parent;
240 241 242 243 244 245 246 247 248 249
		swch->flip = nouveau_flip_complete;
		swch->flip_data = drm->channel;
	}

	if (ret) {
		NV_ERROR(drm, "failed to allocate software object, %d\n", ret);
		nouveau_accel_fini(drm);
		return;
	}

250 251 252
	if (device->info.family < NV_DEVICE_INFO_V0_FERMI) {
		ret = nouveau_gpuobj_new(nvkm_object(&drm->device), NULL, 32,
					 0, 0, &drm->notify);
253 254 255 256 257 258
		if (ret) {
			NV_ERROR(drm, "failed to allocate notifier, %d\n", ret);
			nouveau_accel_fini(drm);
			return;
		}

259
		ret = nvif_object_init(drm->channel->object, NULL, NvNotify0,
260 261 262 263
				       NV_DMA_IN_MEMORY,
				       &(struct nv_dma_v0) {
						.target = NV_DMA_V0_TARGET_VRAM,
						.access = NV_DMA_V0_ACCESS_RDWR,
264 265
						.start = drm->notify->addr,
						.limit = drm->notify->addr + 31
266
				       }, sizeof(struct nv_dma_v0),
267
				       &drm->ntfy);
268 269 270 271 272 273 274
		if (ret) {
			nouveau_accel_fini(drm);
			return;
		}
	}


275
	nouveau_bo_move_init(drm);
276 277
}

278 279
static int nouveau_drm_probe(struct pci_dev *pdev,
			     const struct pci_device_id *pent)
280 281
{
	struct nouveau_device *device;
282 283
	struct apertures_struct *aper;
	bool boot = false;
284 285
	int ret;

286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310
	/* remove conflicting drivers (vesafb, efifb etc) */
	aper = alloc_apertures(3);
	if (!aper)
		return -ENOMEM;

	aper->ranges[0].base = pci_resource_start(pdev, 1);
	aper->ranges[0].size = pci_resource_len(pdev, 1);
	aper->count = 1;

	if (pci_resource_len(pdev, 2)) {
		aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
		aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
		aper->count++;
	}

	if (pci_resource_len(pdev, 3)) {
		aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
		aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
		aper->count++;
	}

#ifdef CONFIG_X86
	boot = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
#endif
	remove_conflicting_framebuffers(aper, "nouveaufb", boot);
311
	kfree(aper);
312

A
Alexandre Courbot 已提交
313 314
	ret = nouveau_device_create(pdev, NOUVEAU_BUS_PCI,
				    nouveau_pci_name(pdev), pci_name(pdev),
315 316 317 318 319 320
				    nouveau_config, nouveau_debug, &device);
	if (ret)
		return ret;

	pci_set_master(pdev);

321
	ret = drm_get_pci_dev(pdev, pent, &driver);
322
	if (ret) {
323
		nouveau_object_ref(NULL, (struct nouveau_object **)&device);
324 325 326 327 328 329
		return ret;
	}

	return 0;
}

330 331 332
#define PCI_CLASS_MULTIMEDIA_HD_AUDIO 0x0403

static void
333
nouveau_get_hdmi_dev(struct nouveau_drm *drm)
334
{
335
	struct pci_dev *pdev = drm->dev->pdev;
336

A
Alexandre Courbot 已提交
337
	if (!pdev) {
338
		DRM_INFO("not a PCI device; no HDMI\n");
A
Alexandre Courbot 已提交
339 340 341 342
		drm->hdmi_device = NULL;
		return;
	}

343 344 345 346 347
	/* subfunction one is a hdmi audio device? */
	drm->hdmi_device = pci_get_bus_and_slot((unsigned int)pdev->bus->number,
						PCI_DEVFN(PCI_SLOT(pdev->devfn), 1));

	if (!drm->hdmi_device) {
348
		NV_DEBUG(drm, "hdmi device not found %d %d %d\n", pdev->bus->number, PCI_SLOT(pdev->devfn), 1);
349 350 351 352
		return;
	}

	if ((drm->hdmi_device->class >> 8) != PCI_CLASS_MULTIMEDIA_HD_AUDIO) {
353
		NV_DEBUG(drm, "possible hdmi device not audio %d\n", drm->hdmi_device->class);
354 355 356 357 358 359
		pci_dev_put(drm->hdmi_device);
		drm->hdmi_device = NULL;
		return;
	}
}

360
static int
361 362 363 364 365 366
nouveau_drm_load(struct drm_device *dev, unsigned long flags)
{
	struct pci_dev *pdev = dev->pdev;
	struct nouveau_drm *drm;
	int ret;

A
Alexandre Courbot 已提交
367 368
	ret = nouveau_cli_create(nouveau_name(dev), "DRM", sizeof(*drm),
				 (void **)&drm);
369 370 371
	if (ret)
		return ret;

372 373
	dev->dev_private = drm;
	drm->dev = dev;
374 375
	nvkm_client(&drm->client.base)->debug =
		nouveau_dbgopt(nouveau_debug, "DRM");
376

377
	INIT_LIST_HEAD(&drm->clients);
378
	spin_lock_init(&drm->tile.lock);
379

380
	nouveau_get_hdmi_dev(drm);
381

382 383 384
	/* make sure AGP controller is in a consistent state before we
	 * (possibly) execute vbios init tables (see nouveau_agp.h)
	 */
A
Alexandre Courbot 已提交
385
	if (pdev && drm_pci_device_is_agp(dev) && dev->agp) {
386 387
		const u64 enables = NV_DEVICE_V0_DISABLE_IDENTIFY |
				    NV_DEVICE_V0_DISABLE_MMIO;
388 389 390
		/* dummy device object, doesn't init anything, but allows
		 * agp code access to registers
		 */
391
		ret = nvif_device_init(&drm->client.base.base, NULL,
392 393
				       NVDRM_DEVICE, NV_DEVICE,
				       &(struct nv_device_v0) {
394
						.device = ~0,
395
						.disable = ~enables,
396
						.debug0 = ~0,
397
				       }, sizeof(struct nv_device_v0),
398
				       &drm->device);
399
		if (ret)
400
			goto fail_device;
401 402

		nouveau_agp_reset(drm);
403
		nvif_device_fini(&drm->device);
404 405
	}

406
	ret = nvif_device_init(&drm->client.base.base, NULL, NVDRM_DEVICE,
407 408
			       NV_DEVICE,
			       &(struct nv_device_v0) {
409 410 411
					.device = ~0,
					.disable = 0,
					.debug0 = 0,
412
			       }, sizeof(struct nv_device_v0),
413
			       &drm->device);
414 415 416
	if (ret)
		goto fail_device;

417 418
	dev->irq_enabled = true;

419 420 421 422
	/* workaround an odd issue on nvc1 by disabling the device's
	 * nosnoop capability.  hopefully won't cause issues until a
	 * better fix is found - assuming there is one...
	 */
423 424
	if (drm->device.info.chipset == 0xc1)
		nvif_mask(&drm->device, 0x00088080, 0x00000800, 0x00000000);
425

426
	nouveau_vga_init(drm);
427 428
	nouveau_agp_init(drm);

429 430
	if (drm->device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
		ret = nouveau_vm_new(nvkm_device(&drm->device), 0, (1ULL << 40),
431
				     0x1000, &drm->client.vm);
432 433
		if (ret)
			goto fail_device;
434

435
		nvkm_client(&drm->client.base)->vm = drm->client.vm;
436 437 438
	}

	ret = nouveau_ttm_init(drm);
439
	if (ret)
440 441 442 443 444 445 446
		goto fail_ttm;

	ret = nouveau_bios_init(dev);
	if (ret)
		goto fail_bios;

	ret = nouveau_display_create(dev);
447
	if (ret)
448 449 450 451 452 453 454 455
		goto fail_dispctor;

	if (dev->mode_config.num_crtc) {
		ret = nouveau_display_init(dev);
		if (ret)
			goto fail_dispinit;
	}

456
	nouveau_sysfs_init(dev);
457
	nouveau_hwmon_init(dev);
458 459
	nouveau_accel_init(drm);
	nouveau_fbcon_init(dev);
460 461 462 463 464 465 466 467 468

	if (nouveau_runtime_pm != 0) {
		pm_runtime_use_autosuspend(dev->dev);
		pm_runtime_set_autosuspend_delay(dev->dev, 5000);
		pm_runtime_set_active(dev->dev);
		pm_runtime_allow(dev->dev);
		pm_runtime_mark_last_busy(dev->dev);
		pm_runtime_put(dev->dev);
	}
469 470
	return 0;

471 472 473 474 475
fail_dispinit:
	nouveau_display_destroy(dev);
fail_dispctor:
	nouveau_bios_takedown(dev);
fail_bios:
476
	nouveau_ttm_fini(drm);
477 478 479
fail_ttm:
	nouveau_agp_fini(drm);
	nouveau_vga_fini(drm);
480
fail_device:
481
	nvif_device_fini(&drm->device);
482 483 484 485
	nouveau_cli_destroy(&drm->client);
	return ret;
}

486
static int
487 488
nouveau_drm_unload(struct drm_device *dev)
{
489
	struct nouveau_drm *drm = nouveau_drm(dev);
490

491
	pm_runtime_get_sync(dev->dev);
492 493
	nouveau_fbcon_fini(dev);
	nouveau_accel_fini(drm);
494
	nouveau_hwmon_fini(dev);
495
	nouveau_sysfs_fini(dev);
496

497 498
	if (dev->mode_config.num_crtc)
		nouveau_display_fini(dev);
499 500 501
	nouveau_display_destroy(dev);

	nouveau_bios_takedown(dev);
502

503
	nouveau_ttm_fini(drm);
504
	nouveau_agp_fini(drm);
505
	nouveau_vga_fini(drm);
506

507
	nvif_device_fini(&drm->device);
508 509
	if (drm->hdmi_device)
		pci_dev_put(drm->hdmi_device);
510 511 512 513
	nouveau_cli_destroy(&drm->client);
	return 0;
}

514 515
void
nouveau_drm_device_remove(struct drm_device *dev)
516
{
517
	struct nouveau_drm *drm = nouveau_drm(dev);
518
	struct nouveau_client *client;
519
	struct nouveau_object *device;
520

521
	dev->irq_enabled = false;
522 523
	client = nvkm_client(&drm->client.base);
	device = client->device;
524 525
	drm_put_dev(dev);

526 527
	nouveau_object_ref(NULL, &device);
	nouveau_object_debug();
528
}
529 530 531 532 533 534 535 536 537
EXPORT_SYMBOL(nouveau_drm_device_remove);

static void
nouveau_drm_remove(struct pci_dev *pdev)
{
	struct drm_device *dev = pci_get_drvdata(pdev);

	nouveau_drm_device_remove(dev);
}
538

539
static int
540
nouveau_do_suspend(struct drm_device *dev, bool runtime)
541
{
542
	struct nouveau_drm *drm = nouveau_drm(dev);
543 544 545
	struct nouveau_cli *cli;
	int ret;

546
	if (dev->mode_config.num_crtc && !runtime) {
547
		NV_INFO(drm, "suspending display...\n");
548 549 550 551
		ret = nouveau_display_suspend(dev);
		if (ret)
			return ret;
	}
552

553
	NV_INFO(drm, "evicting buffers...\n");
554 555
	ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM);

556
	NV_INFO(drm, "waiting for kernel channels to go idle...\n");
557 558 559
	if (drm->cechan) {
		ret = nouveau_channel_idle(drm->cechan);
		if (ret)
560
			goto fail_display;
561 562 563 564 565
	}

	if (drm->channel) {
		ret = nouveau_channel_idle(drm->channel);
		if (ret)
566
			goto fail_display;
567 568
	}

569
	NV_INFO(drm, "suspending client object trees...\n");
570
	if (drm->fence && nouveau_fence(drm)->suspend) {
571 572 573 574
		if (!nouveau_fence(drm)->suspend(drm)) {
			ret = -ENOMEM;
			goto fail_display;
		}
575 576
	}

577
	list_for_each_entry(cli, &drm->clients, head) {
578
		ret = nvif_client_suspend(&cli->base);
579 580 581 582
		if (ret)
			goto fail_client;
	}

583
	NV_INFO(drm, "suspending kernel object tree...\n");
584
	ret = nvif_client_suspend(&drm->client.base);
585 586 587
	if (ret)
		goto fail_client;

588
	nouveau_agp_fini(drm);
589 590 591 592
	return 0;

fail_client:
	list_for_each_entry_continue_reverse(cli, &drm->clients, head) {
593
		nvif_client_resume(&cli->base);
594 595
	}

596 597 598 599
	if (drm->fence && nouveau_fence(drm)->resume)
		nouveau_fence(drm)->resume(drm);

fail_display:
600
	if (dev->mode_config.num_crtc) {
601
		NV_INFO(drm, "resuming display...\n");
602 603
		nouveau_display_resume(dev);
	}
604 605 606
	return ret;
}

D
Dave Airlie 已提交
607
int nouveau_pmops_suspend(struct device *dev)
608
{
D
Dave Airlie 已提交
609 610
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
611 612
	int ret;

613 614
	if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
	    drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
615 616
		return 0;

617 618 619
	if (drm_dev->mode_config.num_crtc)
		nouveau_fbcon_set_suspend(drm_dev, 1);

620
	ret = nouveau_do_suspend(drm_dev, false);
621 622
	if (ret)
		return ret;
D
Dave Airlie 已提交
623 624 625 626 627 628 629

	pci_save_state(pdev);
	pci_disable_device(pdev);
	pci_set_power_state(pdev, PCI_D3hot);
	return 0;
}

630
static int
D
Dave Airlie 已提交
631 632 633 634 635
nouveau_do_resume(struct drm_device *dev)
{
	struct nouveau_drm *drm = nouveau_drm(dev);
	struct nouveau_cli *cli;

636
	NV_INFO(drm, "re-enabling device...\n");
637

638 639
	nouveau_agp_reset(drm);

640
	NV_INFO(drm, "resuming kernel object tree...\n");
641
	nvif_client_resume(&drm->client.base);
642
	nouveau_agp_init(drm);
643

644
	NV_INFO(drm, "resuming client object trees...\n");
645 646 647
	if (drm->fence && nouveau_fence(drm)->resume)
		nouveau_fence(drm)->resume(drm);

648
	list_for_each_entry(cli, &drm->clients, head) {
649
		nvif_client_resume(&cli->base);
650
	}
651

652 653
	nouveau_run_vbios_init(dev);

654
	if (dev->mode_config.num_crtc) {
655
		NV_INFO(drm, "resuming display...\n");
656
		nouveau_display_repin(dev);
657
	}
658

659
	return 0;
660 661
}

D
Dave Airlie 已提交
662 663 664 665 666 667
int nouveau_pmops_resume(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
	int ret;

668 669
	if (drm_dev->switch_power_state == DRM_SWITCH_POWER_OFF ||
	    drm_dev->switch_power_state == DRM_SWITCH_POWER_DYNAMIC_OFF)
D
Dave Airlie 已提交
670 671 672 673 674 675 676 677 678
		return 0;

	pci_set_power_state(pdev, PCI_D0);
	pci_restore_state(pdev);
	ret = pci_enable_device(pdev);
	if (ret)
		return ret;
	pci_set_master(pdev);

679
	ret = nouveau_do_resume(drm_dev);
680
	if (ret)
681 682
		return ret;

683
	if (drm_dev->mode_config.num_crtc) {
684
		nouveau_display_resume(drm_dev);
685 686 687
		nouveau_fbcon_set_suspend(drm_dev, 0);
	}

688
	return 0;
D
Dave Airlie 已提交
689 690 691 692 693 694
}

static int nouveau_pmops_freeze(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
695 696 697 698
	int ret;

	if (drm_dev->mode_config.num_crtc)
		nouveau_fbcon_set_suspend(drm_dev, 1);
D
Dave Airlie 已提交
699

700
	ret = nouveau_do_suspend(drm_dev, false);
701
	return ret;
D
Dave Airlie 已提交
702 703 704 705 706 707
}

static int nouveau_pmops_thaw(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
708
	int ret;
D
Dave Airlie 已提交
709

710
	ret = nouveau_do_resume(drm_dev);
711
	if (ret)
712
		return ret;
713 714

	if (drm_dev->mode_config.num_crtc) {
715
		nouveau_display_resume(drm_dev);
716 717 718
		nouveau_fbcon_set_suspend(drm_dev, 0);
	}

719
	return 0;
D
Dave Airlie 已提交
720 721 722
}


723
static int
724 725 726 727
nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
{
	struct nouveau_drm *drm = nouveau_drm(dev);
	struct nouveau_cli *cli;
728
	char name[32], tmpname[TASK_COMM_LEN];
729 730
	int ret;

731 732
	/* need to bring up power immediately if opening device */
	ret = pm_runtime_get_sync(dev->dev);
733
	if (ret < 0 && ret != -EACCES)
734 735
		return ret;

736 737
	get_task_comm(tmpname, current);
	snprintf(name, sizeof(name), "%s[%d]", tmpname, pid_nr(fpriv->pid));
738

A
Alexandre Courbot 已提交
739 740 741
	ret = nouveau_cli_create(nouveau_name(dev), name, sizeof(*cli),
			(void **)&cli);

742
	if (ret)
743
		goto out_suspend;
744

745 746
	cli->base.super = false;

747 748
	if (drm->device.info.family >= NV_DEVICE_INFO_V0_TESLA) {
		ret = nouveau_vm_new(nvkm_device(&drm->device), 0, (1ULL << 40),
749
				     0x1000, &cli->vm);
750 751
		if (ret) {
			nouveau_cli_destroy(cli);
752
			goto out_suspend;
753
		}
754

755
		nvkm_client(&cli->base)->vm = cli->vm;
756 757 758 759 760 761 762
	}

	fpriv->driver_priv = cli;

	mutex_lock(&drm->client.mutex);
	list_add(&cli->head, &drm->clients);
	mutex_unlock(&drm->client.mutex);
763 764 765 766 767 768

out_suspend:
	pm_runtime_mark_last_busy(dev->dev);
	pm_runtime_put_autosuspend(dev->dev);

	return ret;
769 770
}

771
static void
772 773 774 775 776
nouveau_drm_preclose(struct drm_device *dev, struct drm_file *fpriv)
{
	struct nouveau_cli *cli = nouveau_cli(fpriv);
	struct nouveau_drm *drm = nouveau_drm(dev);

777 778
	pm_runtime_get_sync(dev->dev);

779 780 781 782 783 784
	if (cli->abi16)
		nouveau_abi16_fini(cli->abi16);

	mutex_lock(&drm->client.mutex);
	list_del(&cli->head);
	mutex_unlock(&drm->client.mutex);
785

786 787
}

788
static void
789 790 791 792
nouveau_drm_postclose(struct drm_device *dev, struct drm_file *fpriv)
{
	struct nouveau_cli *cli = nouveau_cli(fpriv);
	nouveau_cli_destroy(cli);
793 794
	pm_runtime_mark_last_busy(dev->dev);
	pm_runtime_put_autosuspend(dev->dev);
795 796
}

R
Rob Clark 已提交
797
static const struct drm_ioctl_desc
798
nouveau_ioctls[] = {
M
Martin Peres 已提交
799
	DRM_IOCTL_DEF_DRV(NOUVEAU_GETPARAM, nouveau_abi16_ioctl_getparam, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
800
	DRM_IOCTL_DEF_DRV(NOUVEAU_SETPARAM, nouveau_abi16_ioctl_setparam, DRM_UNLOCKED|DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
M
Martin Peres 已提交
801 802 803 804 805 806 807 808 809 810
	DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_ALLOC, nouveau_abi16_ioctl_channel_alloc, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_CHANNEL_FREE, nouveau_abi16_ioctl_channel_free, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GROBJ_ALLOC, nouveau_abi16_ioctl_grobj_alloc, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_NOTIFIEROBJ_ALLOC, nouveau_abi16_ioctl_notifierobj_alloc, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GPUOBJ_FREE, nouveau_abi16_ioctl_gpuobj_free, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_NEW, nouveau_gem_ioctl_new, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_PUSHBUF, nouveau_gem_ioctl_pushbuf, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_PREP, nouveau_gem_ioctl_cpu_prep, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_CPU_FINI, nouveau_gem_ioctl_cpu_fini, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
	DRM_IOCTL_DEF_DRV(NOUVEAU_GEM_INFO, nouveau_gem_ioctl_info, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW),
811 812
};

813 814 815 816 817 818 819 820 821
long nouveau_drm_ioctl(struct file *filp,
		       unsigned int cmd, unsigned long arg)
{
	struct drm_file *file_priv = filp->private_data;
	struct drm_device *dev;
	long ret;
	dev = file_priv->minor->dev;

	ret = pm_runtime_get_sync(dev->dev);
822
	if (ret < 0 && ret != -EACCES)
823 824 825 826 827 828 829 830
		return ret;

	ret = drm_ioctl(filp, cmd, arg);

	pm_runtime_mark_last_busy(dev->dev);
	pm_runtime_put_autosuspend(dev->dev);
	return ret;
}
831 832 833 834 835
static const struct file_operations
nouveau_driver_fops = {
	.owner = THIS_MODULE,
	.open = drm_open,
	.release = drm_release,
836
	.unlocked_ioctl = nouveau_drm_ioctl,
837 838 839 840 841 842 843 844 845 846 847 848
	.mmap = nouveau_ttm_mmap,
	.poll = drm_poll,
	.read = drm_read,
#if defined(CONFIG_COMPAT)
	.compat_ioctl = nouveau_compat_ioctl,
#endif
	.llseek = noop_llseek,
};

static struct drm_driver
driver = {
	.driver_features =
849
		DRIVER_USE_AGP |
M
Martin Peres 已提交
850
		DRIVER_GEM | DRIVER_MODESET | DRIVER_PRIME | DRIVER_RENDER,
851 852 853 854 855 856 857 858

	.load = nouveau_drm_load,
	.unload = nouveau_drm_unload,
	.open = nouveau_drm_open,
	.preclose = nouveau_drm_preclose,
	.postclose = nouveau_drm_postclose,
	.lastclose = nouveau_vga_lastclose,

859 860 861 862 863
#if defined(CONFIG_DEBUG_FS)
	.debugfs_init = nouveau_debugfs_init,
	.debugfs_cleanup = nouveau_debugfs_takedown,
#endif

864
	.get_vblank_counter = drm_vblank_count,
865 866
	.enable_vblank = nouveau_display_vblank_enable,
	.disable_vblank = nouveau_display_vblank_disable,
867 868
	.get_scanout_position = nouveau_display_scanoutpos,
	.get_vblank_timestamp = nouveau_display_vblstamp,
869 870

	.ioctls = nouveau_ioctls,
R
Rob Clark 已提交
871
	.num_ioctls = ARRAY_SIZE(nouveau_ioctls),
872 873 874 875
	.fops = &nouveau_driver_fops,

	.prime_handle_to_fd = drm_gem_prime_handle_to_fd,
	.prime_fd_to_handle = drm_gem_prime_fd_to_handle,
A
Aaron Plattner 已提交
876 877 878
	.gem_prime_export = drm_gem_prime_export,
	.gem_prime_import = drm_gem_prime_import,
	.gem_prime_pin = nouveau_gem_prime_pin,
879
	.gem_prime_unpin = nouveau_gem_prime_unpin,
A
Aaron Plattner 已提交
880 881 882 883
	.gem_prime_get_sg_table = nouveau_gem_prime_get_sg_table,
	.gem_prime_import_sg_table = nouveau_gem_prime_import_sg_table,
	.gem_prime_vmap = nouveau_gem_prime_vmap,
	.gem_prime_vunmap = nouveau_gem_prime_vunmap,
884 885 886 887 888 889 890

	.gem_free_object = nouveau_gem_object_del,
	.gem_open_object = nouveau_gem_object_open,
	.gem_close_object = nouveau_gem_object_close,

	.dumb_create = nouveau_display_dumb_create,
	.dumb_map_offset = nouveau_display_dumb_map_offset,
891
	.dumb_destroy = drm_gem_dumb_destroy,
892 893 894 895 896 897 898 899 900 901 902 903 904

	.name = DRIVER_NAME,
	.desc = DRIVER_DESC,
#ifdef GIT_REVISION
	.date = GIT_REVISION,
#else
	.date = DRIVER_DATE,
#endif
	.major = DRIVER_MAJOR,
	.minor = DRIVER_MINOR,
	.patchlevel = DRIVER_PATCHLEVEL,
};

905 906 907 908 909 910 911 912 913 914 915 916 917 918 919
static struct pci_device_id
nouveau_drm_pci_table[] = {
	{
		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID),
		.class = PCI_BASE_CLASS_DISPLAY << 16,
		.class_mask  = 0xff << 16,
	},
	{
		PCI_DEVICE(PCI_VENDOR_ID_NVIDIA_SGS, PCI_ANY_ID),
		.class = PCI_BASE_CLASS_DISPLAY << 16,
		.class_mask  = 0xff << 16,
	},
	{}
};

920 921 922 923 924 925
static int nouveau_pmops_runtime_suspend(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
	int ret;

926 927 928 929
	if (nouveau_runtime_pm == 0) {
		pm_runtime_forbid(dev);
		return -EBUSY;
	}
930

931 932 933
	/* are we optimus enabled? */
	if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
		DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
934 935
		pm_runtime_forbid(dev);
		return -EBUSY;
936 937
	}

938
	nv_debug_level(SILENT);
939 940 941
	drm_kms_helper_poll_disable(drm_dev);
	vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_OFF);
	nouveau_switcheroo_optimus_dsm();
942
	ret = nouveau_do_suspend(drm_dev, true);
943 944 945 946 947 948 949 950 951 952 953
	pci_save_state(pdev);
	pci_disable_device(pdev);
	pci_set_power_state(pdev, PCI_D3cold);
	drm_dev->switch_power_state = DRM_SWITCH_POWER_DYNAMIC_OFF;
	return ret;
}

static int nouveau_pmops_runtime_resume(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
954
	struct nvif_device *device = &nouveau_drm(drm_dev)->device;
955 956 957 958 959 960 961 962 963 964 965 966 967 968 969
	int ret;

	if (nouveau_runtime_pm == 0)
		return -EINVAL;

	pci_set_power_state(pdev, PCI_D0);
	pci_restore_state(pdev);
	ret = pci_enable_device(pdev);
	if (ret)
		return ret;
	pci_set_master(pdev);

	ret = nouveau_do_resume(drm_dev);
	drm_kms_helper_poll_enable(drm_dev);
	/* do magic */
970
	nvif_mask(device, 0x88488, (1 << 25), (1 << 25));
971 972
	vga_switcheroo_set_dynamic_switch(pdev, VGA_SWITCHEROO_ON);
	drm_dev->switch_power_state = DRM_SWITCH_POWER_ON;
973
	nv_debug_level(NORMAL);
974 975 976 977 978 979 980 981 982 983
	return ret;
}

static int nouveau_pmops_runtime_idle(struct device *dev)
{
	struct pci_dev *pdev = to_pci_dev(dev);
	struct drm_device *drm_dev = pci_get_drvdata(pdev);
	struct nouveau_drm *drm = nouveau_drm(drm_dev);
	struct drm_crtc *crtc;

984 985
	if (nouveau_runtime_pm == 0) {
		pm_runtime_forbid(dev);
986
		return -EBUSY;
987
	}
988 989 990 991

	/* are we optimus enabled? */
	if (nouveau_runtime_pm == -1 && !nouveau_is_optimus() && !nouveau_is_v1_dsm()) {
		DRM_DEBUG_DRIVER("failing to power off - not optimus\n");
992
		pm_runtime_forbid(dev);
993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016
		return -EBUSY;
	}

	/* if we have a hdmi audio device - make sure it has a driver loaded */
	if (drm->hdmi_device) {
		if (!drm->hdmi_device->driver) {
			DRM_DEBUG_DRIVER("failing to power off - no HDMI audio driver loaded\n");
			pm_runtime_mark_last_busy(dev);
			return -EBUSY;
		}
	}

	list_for_each_entry(crtc, &drm->dev->mode_config.crtc_list, head) {
		if (crtc->enabled) {
			DRM_DEBUG_DRIVER("failing to power off - crtc active\n");
			return -EBUSY;
		}
	}
	pm_runtime_mark_last_busy(dev);
	pm_runtime_autosuspend(dev);
	/* we don't want the main rpm_idle to call suspend - we want to autosuspend */
	return 1;
}

D
Dave Airlie 已提交
1017 1018 1019 1020 1021 1022 1023
static const struct dev_pm_ops nouveau_pm_ops = {
	.suspend = nouveau_pmops_suspend,
	.resume = nouveau_pmops_resume,
	.freeze = nouveau_pmops_freeze,
	.thaw = nouveau_pmops_thaw,
	.poweroff = nouveau_pmops_freeze,
	.restore = nouveau_pmops_resume,
1024 1025 1026
	.runtime_suspend = nouveau_pmops_runtime_suspend,
	.runtime_resume = nouveau_pmops_runtime_resume,
	.runtime_idle = nouveau_pmops_runtime_idle,
D
Dave Airlie 已提交
1027 1028
};

1029 1030 1031 1032 1033 1034
static struct pci_driver
nouveau_drm_pci_driver = {
	.name = "nouveau",
	.id_table = nouveau_drm_pci_table,
	.probe = nouveau_drm_probe,
	.remove = nouveau_drm_remove,
D
Dave Airlie 已提交
1035
	.driver.pm = &nouveau_pm_ops,
1036 1037
};

1038 1039 1040
struct drm_device *
nouveau_platform_device_create_(struct platform_device *pdev, int size,
				void **pobject)
A
Alexandre Courbot 已提交
1041
{
1042 1043
	struct drm_device *drm;
	int err;
A
Alexandre Courbot 已提交
1044

1045
	err = nouveau_device_create_(pdev, NOUVEAU_BUS_PLATFORM,
A
Alexandre Courbot 已提交
1046 1047
				    nouveau_platform_name(pdev),
				    dev_name(&pdev->dev), nouveau_config,
1048 1049 1050 1051 1052 1053 1054 1055
				    nouveau_debug, size, pobject);
	if (err)
		return ERR_PTR(err);

	drm = drm_dev_alloc(&driver, &pdev->dev);
	if (!drm) {
		err = -ENOMEM;
		goto err_free;
A
Alexandre Courbot 已提交
1056 1057
	}

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070
	err = drm_dev_set_unique(drm, "%s", dev_name(&pdev->dev));
	if (err < 0)
		goto err_free;

	drm->platformdev = pdev;
	platform_set_drvdata(pdev, drm);

	return drm;

err_free:
	nouveau_object_ref(NULL, (struct nouveau_object **)pobject);

	return ERR_PTR(err);
A
Alexandre Courbot 已提交
1071
}
1072
EXPORT_SYMBOL(nouveau_platform_device_create_);
A
Alexandre Courbot 已提交
1073

1074 1075 1076
static int __init
nouveau_drm_init(void)
{
1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
	if (nouveau_modeset == -1) {
#ifdef CONFIG_VGA_CONSOLE
		if (vgacon_text_force())
			nouveau_modeset = 0;
#endif
	}

	if (!nouveau_modeset)
		return 0;

	nouveau_register_dsm_handler();
	return drm_pci_init(&driver, &nouveau_drm_pci_driver);
1089 1090 1091 1092 1093
}

static void __exit
nouveau_drm_exit(void)
{
1094 1095 1096 1097 1098
	if (!nouveau_modeset)
		return;

	drm_pci_exit(&driver, &nouveau_drm_pci_driver);
	nouveau_unregister_dsm_handler();
1099 1100 1101 1102 1103 1104
}

module_init(nouveau_drm_init);
module_exit(nouveau_drm_exit);

MODULE_DEVICE_TABLE(pci, nouveau_drm_pci_table);
1105 1106
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
1107
MODULE_LICENSE("GPL and additional rights");