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