Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
   1/*
   2 * Copyright 2005 Stephane Marchesin
   3 * Copyright 2008 Stuart Bennett
   4 * All Rights Reserved.
   5 *
   6 * Permission is hereby granted, free of charge, to any person obtaining a
   7 * copy of this software and associated documentation files (the "Software"),
   8 * to deal in the Software without restriction, including without limitation
   9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  10 * and/or sell copies of the Software, and to permit persons to whom the
  11 * Software is furnished to do so, subject to the following conditions:
  12 *
  13 * The above copyright notice and this permission notice (including the next
  14 * paragraph) shall be included in all copies or substantial portions of the
  15 * Software.
  16 *
  17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20 * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  23 * DEALINGS IN THE SOFTWARE.
  24 */
  25
  26#include <linux/swab.h>
  27#include <linux/slab.h>
  28#include "drmP.h"
  29#include "drm.h"
  30#include "drm_sarea.h"
  31#include "drm_crtc_helper.h"
  32#include <linux/vgaarb.h>
  33#include <linux/vga_switcheroo.h>
  34
  35#include "nouveau_drv.h"
  36#include "nouveau_drm.h"
  37#include "nouveau_fbcon.h"
  38#include "nouveau_ramht.h"
  39#include "nouveau_gpio.h"
  40#include "nouveau_pm.h"
  41#include "nv50_display.h"
  42#include "nouveau_fifo.h"
  43#include "nouveau_fence.h"
  44#include "nouveau_software.h"
  45
  46static void nouveau_stub_takedown(struct drm_device *dev) {}
  47static int nouveau_stub_init(struct drm_device *dev) { return 0; }
  48
  49static int nouveau_init_engine_ptrs(struct drm_device *dev)
  50{
  51	struct drm_nouveau_private *dev_priv = dev->dev_private;
  52	struct nouveau_engine *engine = &dev_priv->engine;
  53
  54	switch (dev_priv->chipset & 0xf0) {
  55	case 0x00:
  56		engine->instmem.init		= nv04_instmem_init;
  57		engine->instmem.takedown	= nv04_instmem_takedown;
  58		engine->instmem.suspend		= nv04_instmem_suspend;
  59		engine->instmem.resume		= nv04_instmem_resume;
  60		engine->instmem.get		= nv04_instmem_get;
  61		engine->instmem.put		= nv04_instmem_put;
  62		engine->instmem.map		= nv04_instmem_map;
  63		engine->instmem.unmap		= nv04_instmem_unmap;
  64		engine->instmem.flush		= nv04_instmem_flush;
  65		engine->mc.init			= nv04_mc_init;
  66		engine->mc.takedown		= nv04_mc_takedown;
  67		engine->timer.init		= nv04_timer_init;
  68		engine->timer.read		= nv04_timer_read;
  69		engine->timer.takedown		= nv04_timer_takedown;
  70		engine->fb.init			= nv04_fb_init;
  71		engine->fb.takedown		= nv04_fb_takedown;
  72		engine->display.early_init	= nv04_display_early_init;
  73		engine->display.late_takedown	= nv04_display_late_takedown;
  74		engine->display.create		= nv04_display_create;
  75		engine->display.destroy		= nv04_display_destroy;
  76		engine->display.init		= nv04_display_init;
  77		engine->display.fini		= nv04_display_fini;
  78		engine->pm.clocks_get		= nv04_pm_clocks_get;
  79		engine->pm.clocks_pre		= nv04_pm_clocks_pre;
  80		engine->pm.clocks_set		= nv04_pm_clocks_set;
  81		engine->vram.init		= nv04_fb_vram_init;
  82		engine->vram.takedown		= nouveau_stub_takedown;
  83		engine->vram.flags_valid	= nouveau_mem_flags_valid;
  84		break;
  85	case 0x10:
  86		engine->instmem.init		= nv04_instmem_init;
  87		engine->instmem.takedown	= nv04_instmem_takedown;
  88		engine->instmem.suspend		= nv04_instmem_suspend;
  89		engine->instmem.resume		= nv04_instmem_resume;
  90		engine->instmem.get		= nv04_instmem_get;
  91		engine->instmem.put		= nv04_instmem_put;
  92		engine->instmem.map		= nv04_instmem_map;
  93		engine->instmem.unmap		= nv04_instmem_unmap;
  94		engine->instmem.flush		= nv04_instmem_flush;
  95		engine->mc.init			= nv04_mc_init;
  96		engine->mc.takedown		= nv04_mc_takedown;
  97		engine->timer.init		= nv04_timer_init;
  98		engine->timer.read		= nv04_timer_read;
  99		engine->timer.takedown		= nv04_timer_takedown;
 100		engine->fb.init			= nv10_fb_init;
 101		engine->fb.takedown		= nv10_fb_takedown;
 102		engine->fb.init_tile_region	= nv10_fb_init_tile_region;
 103		engine->fb.set_tile_region	= nv10_fb_set_tile_region;
 104		engine->fb.free_tile_region	= nv10_fb_free_tile_region;
 105		engine->display.early_init	= nv04_display_early_init;
 106		engine->display.late_takedown	= nv04_display_late_takedown;
 107		engine->display.create		= nv04_display_create;
 108		engine->display.destroy		= nv04_display_destroy;
 109		engine->display.init		= nv04_display_init;
 110		engine->display.fini		= nv04_display_fini;
 111		engine->gpio.drive		= nv10_gpio_drive;
 112		engine->gpio.sense		= nv10_gpio_sense;
 113		engine->pm.clocks_get		= nv04_pm_clocks_get;
 114		engine->pm.clocks_pre		= nv04_pm_clocks_pre;
 115		engine->pm.clocks_set		= nv04_pm_clocks_set;
 116		if (dev_priv->chipset == 0x1a ||
 117		    dev_priv->chipset == 0x1f)
 118			engine->vram.init	= nv1a_fb_vram_init;
 119		else
 120			engine->vram.init	= nv10_fb_vram_init;
 121		engine->vram.takedown		= nouveau_stub_takedown;
 122		engine->vram.flags_valid	= nouveau_mem_flags_valid;
 123		break;
 124	case 0x20:
 125		engine->instmem.init		= nv04_instmem_init;
 126		engine->instmem.takedown	= nv04_instmem_takedown;
 127		engine->instmem.suspend		= nv04_instmem_suspend;
 128		engine->instmem.resume		= nv04_instmem_resume;
 129		engine->instmem.get		= nv04_instmem_get;
 130		engine->instmem.put		= nv04_instmem_put;
 131		engine->instmem.map		= nv04_instmem_map;
 132		engine->instmem.unmap		= nv04_instmem_unmap;
 133		engine->instmem.flush		= nv04_instmem_flush;
 134		engine->mc.init			= nv04_mc_init;
 135		engine->mc.takedown		= nv04_mc_takedown;
 136		engine->timer.init		= nv04_timer_init;
 137		engine->timer.read		= nv04_timer_read;
 138		engine->timer.takedown		= nv04_timer_takedown;
 139		engine->fb.init			= nv20_fb_init;
 140		engine->fb.takedown		= nv20_fb_takedown;
 141		engine->fb.init_tile_region	= nv20_fb_init_tile_region;
 142		engine->fb.set_tile_region	= nv20_fb_set_tile_region;
 143		engine->fb.free_tile_region	= nv20_fb_free_tile_region;
 144		engine->display.early_init	= nv04_display_early_init;
 145		engine->display.late_takedown	= nv04_display_late_takedown;
 146		engine->display.create		= nv04_display_create;
 147		engine->display.destroy		= nv04_display_destroy;
 148		engine->display.init		= nv04_display_init;
 149		engine->display.fini		= nv04_display_fini;
 150		engine->gpio.drive		= nv10_gpio_drive;
 151		engine->gpio.sense		= nv10_gpio_sense;
 152		engine->pm.clocks_get		= nv04_pm_clocks_get;
 153		engine->pm.clocks_pre		= nv04_pm_clocks_pre;
 154		engine->pm.clocks_set		= nv04_pm_clocks_set;
 155		engine->vram.init		= nv20_fb_vram_init;
 156		engine->vram.takedown		= nouveau_stub_takedown;
 157		engine->vram.flags_valid	= nouveau_mem_flags_valid;
 158		break;
 159	case 0x30:
 160		engine->instmem.init		= nv04_instmem_init;
 161		engine->instmem.takedown	= nv04_instmem_takedown;
 162		engine->instmem.suspend		= nv04_instmem_suspend;
 163		engine->instmem.resume		= nv04_instmem_resume;
 164		engine->instmem.get		= nv04_instmem_get;
 165		engine->instmem.put		= nv04_instmem_put;
 166		engine->instmem.map		= nv04_instmem_map;
 167		engine->instmem.unmap		= nv04_instmem_unmap;
 168		engine->instmem.flush		= nv04_instmem_flush;
 169		engine->mc.init			= nv04_mc_init;
 170		engine->mc.takedown		= nv04_mc_takedown;
 171		engine->timer.init		= nv04_timer_init;
 172		engine->timer.read		= nv04_timer_read;
 173		engine->timer.takedown		= nv04_timer_takedown;
 174		engine->fb.init			= nv30_fb_init;
 175		engine->fb.takedown		= nv30_fb_takedown;
 176		engine->fb.init_tile_region	= nv30_fb_init_tile_region;
 177		engine->fb.set_tile_region	= nv10_fb_set_tile_region;
 178		engine->fb.free_tile_region	= nv30_fb_free_tile_region;
 179		engine->display.early_init	= nv04_display_early_init;
 180		engine->display.late_takedown	= nv04_display_late_takedown;
 181		engine->display.create		= nv04_display_create;
 182		engine->display.destroy		= nv04_display_destroy;
 183		engine->display.init		= nv04_display_init;
 184		engine->display.fini		= nv04_display_fini;
 185		engine->gpio.drive		= nv10_gpio_drive;
 186		engine->gpio.sense		= nv10_gpio_sense;
 187		engine->pm.clocks_get		= nv04_pm_clocks_get;
 188		engine->pm.clocks_pre		= nv04_pm_clocks_pre;
 189		engine->pm.clocks_set		= nv04_pm_clocks_set;
 190		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
 191		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
 192		engine->vram.init		= nv20_fb_vram_init;
 193		engine->vram.takedown		= nouveau_stub_takedown;
 194		engine->vram.flags_valid	= nouveau_mem_flags_valid;
 195		break;
 196	case 0x40:
 197	case 0x60:
 198		engine->instmem.init		= nv04_instmem_init;
 199		engine->instmem.takedown	= nv04_instmem_takedown;
 200		engine->instmem.suspend		= nv04_instmem_suspend;
 201		engine->instmem.resume		= nv04_instmem_resume;
 202		engine->instmem.get		= nv04_instmem_get;
 203		engine->instmem.put		= nv04_instmem_put;
 204		engine->instmem.map		= nv04_instmem_map;
 205		engine->instmem.unmap		= nv04_instmem_unmap;
 206		engine->instmem.flush		= nv04_instmem_flush;
 207		engine->mc.init			= nv40_mc_init;
 208		engine->mc.takedown		= nv40_mc_takedown;
 209		engine->timer.init		= nv04_timer_init;
 210		engine->timer.read		= nv04_timer_read;
 211		engine->timer.takedown		= nv04_timer_takedown;
 212		engine->fb.init			= nv40_fb_init;
 213		engine->fb.takedown		= nv40_fb_takedown;
 214		engine->fb.init_tile_region	= nv30_fb_init_tile_region;
 215		engine->fb.set_tile_region	= nv40_fb_set_tile_region;
 216		engine->fb.free_tile_region	= nv30_fb_free_tile_region;
 217		engine->display.early_init	= nv04_display_early_init;
 218		engine->display.late_takedown	= nv04_display_late_takedown;
 219		engine->display.create		= nv04_display_create;
 220		engine->display.destroy		= nv04_display_destroy;
 221		engine->display.init		= nv04_display_init;
 222		engine->display.fini		= nv04_display_fini;
 223		engine->gpio.init		= nv10_gpio_init;
 224		engine->gpio.fini		= nv10_gpio_fini;
 225		engine->gpio.drive		= nv10_gpio_drive;
 226		engine->gpio.sense		= nv10_gpio_sense;
 227		engine->gpio.irq_enable		= nv10_gpio_irq_enable;
 228		engine->pm.clocks_get		= nv40_pm_clocks_get;
 229		engine->pm.clocks_pre		= nv40_pm_clocks_pre;
 230		engine->pm.clocks_set		= nv40_pm_clocks_set;
 231		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
 232		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
 233		engine->pm.temp_get		= nv40_temp_get;
 234		engine->pm.pwm_get		= nv40_pm_pwm_get;
 235		engine->pm.pwm_set		= nv40_pm_pwm_set;
 236		engine->vram.init		= nv40_fb_vram_init;
 237		engine->vram.takedown		= nouveau_stub_takedown;
 238		engine->vram.flags_valid	= nouveau_mem_flags_valid;
 239		break;
 240	case 0x50:
 241	case 0x80: /* gotta love NVIDIA's consistency.. */
 242	case 0x90:
 243	case 0xa0:
 244		engine->instmem.init		= nv50_instmem_init;
 245		engine->instmem.takedown	= nv50_instmem_takedown;
 246		engine->instmem.suspend		= nv50_instmem_suspend;
 247		engine->instmem.resume		= nv50_instmem_resume;
 248		engine->instmem.get		= nv50_instmem_get;
 249		engine->instmem.put		= nv50_instmem_put;
 250		engine->instmem.map		= nv50_instmem_map;
 251		engine->instmem.unmap		= nv50_instmem_unmap;
 252		if (dev_priv->chipset == 0x50)
 253			engine->instmem.flush	= nv50_instmem_flush;
 254		else
 255			engine->instmem.flush	= nv84_instmem_flush;
 256		engine->mc.init			= nv50_mc_init;
 257		engine->mc.takedown		= nv50_mc_takedown;
 258		engine->timer.init		= nv04_timer_init;
 259		engine->timer.read		= nv04_timer_read;
 260		engine->timer.takedown		= nv04_timer_takedown;
 261		engine->fb.init			= nv50_fb_init;
 262		engine->fb.takedown		= nv50_fb_takedown;
 263		engine->display.early_init	= nv50_display_early_init;
 264		engine->display.late_takedown	= nv50_display_late_takedown;
 265		engine->display.create		= nv50_display_create;
 266		engine->display.destroy		= nv50_display_destroy;
 267		engine->display.init		= nv50_display_init;
 268		engine->display.fini		= nv50_display_fini;
 269		engine->gpio.init		= nv50_gpio_init;
 270		engine->gpio.fini		= nv50_gpio_fini;
 271		engine->gpio.drive		= nv50_gpio_drive;
 272		engine->gpio.sense		= nv50_gpio_sense;
 273		engine->gpio.irq_enable		= nv50_gpio_irq_enable;
 274		switch (dev_priv->chipset) {
 275		case 0x84:
 276		case 0x86:
 277		case 0x92:
 278		case 0x94:
 279		case 0x96:
 280		case 0x98:
 281		case 0xa0:
 282		case 0xaa:
 283		case 0xac:
 284		case 0x50:
 285			engine->pm.clocks_get	= nv50_pm_clocks_get;
 286			engine->pm.clocks_pre	= nv50_pm_clocks_pre;
 287			engine->pm.clocks_set	= nv50_pm_clocks_set;
 288			break;
 289		default:
 290			engine->pm.clocks_get	= nva3_pm_clocks_get;
 291			engine->pm.clocks_pre	= nva3_pm_clocks_pre;
 292			engine->pm.clocks_set	= nva3_pm_clocks_set;
 293			break;
 294		}
 295		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
 296		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
 297		if (dev_priv->chipset >= 0x84)
 298			engine->pm.temp_get	= nv84_temp_get;
 299		else
 300			engine->pm.temp_get	= nv40_temp_get;
 301		engine->pm.pwm_get		= nv50_pm_pwm_get;
 302		engine->pm.pwm_set		= nv50_pm_pwm_set;
 303		engine->vram.init		= nv50_vram_init;
 304		engine->vram.takedown		= nv50_vram_fini;
 305		engine->vram.get		= nv50_vram_new;
 306		engine->vram.put		= nv50_vram_del;
 307		engine->vram.flags_valid	= nv50_vram_flags_valid;
 308		break;
 309	case 0xc0:
 310		engine->instmem.init		= nvc0_instmem_init;
 311		engine->instmem.takedown	= nvc0_instmem_takedown;
 312		engine->instmem.suspend		= nvc0_instmem_suspend;
 313		engine->instmem.resume		= nvc0_instmem_resume;
 314		engine->instmem.get		= nv50_instmem_get;
 315		engine->instmem.put		= nv50_instmem_put;
 316		engine->instmem.map		= nv50_instmem_map;
 317		engine->instmem.unmap		= nv50_instmem_unmap;
 318		engine->instmem.flush		= nv84_instmem_flush;
 319		engine->mc.init			= nv50_mc_init;
 320		engine->mc.takedown		= nv50_mc_takedown;
 321		engine->timer.init		= nv04_timer_init;
 322		engine->timer.read		= nv04_timer_read;
 323		engine->timer.takedown		= nv04_timer_takedown;
 324		engine->fb.init			= nvc0_fb_init;
 325		engine->fb.takedown		= nvc0_fb_takedown;
 326		engine->display.early_init	= nv50_display_early_init;
 327		engine->display.late_takedown	= nv50_display_late_takedown;
 328		engine->display.create		= nv50_display_create;
 329		engine->display.destroy		= nv50_display_destroy;
 330		engine->display.init		= nv50_display_init;
 331		engine->display.fini		= nv50_display_fini;
 332		engine->gpio.init		= nv50_gpio_init;
 333		engine->gpio.fini		= nv50_gpio_fini;
 334		engine->gpio.drive		= nv50_gpio_drive;
 335		engine->gpio.sense		= nv50_gpio_sense;
 336		engine->gpio.irq_enable		= nv50_gpio_irq_enable;
 337		engine->vram.init		= nvc0_vram_init;
 338		engine->vram.takedown		= nv50_vram_fini;
 339		engine->vram.get		= nvc0_vram_new;
 340		engine->vram.put		= nv50_vram_del;
 341		engine->vram.flags_valid	= nvc0_vram_flags_valid;
 342		engine->pm.temp_get		= nv84_temp_get;
 343		engine->pm.clocks_get		= nvc0_pm_clocks_get;
 344		engine->pm.clocks_pre		= nvc0_pm_clocks_pre;
 345		engine->pm.clocks_set		= nvc0_pm_clocks_set;
 346		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
 347		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
 348		engine->pm.pwm_get		= nv50_pm_pwm_get;
 349		engine->pm.pwm_set		= nv50_pm_pwm_set;
 350		break;
 351	case 0xd0:
 352		engine->instmem.init		= nvc0_instmem_init;
 353		engine->instmem.takedown	= nvc0_instmem_takedown;
 354		engine->instmem.suspend		= nvc0_instmem_suspend;
 355		engine->instmem.resume		= nvc0_instmem_resume;
 356		engine->instmem.get		= nv50_instmem_get;
 357		engine->instmem.put		= nv50_instmem_put;
 358		engine->instmem.map		= nv50_instmem_map;
 359		engine->instmem.unmap		= nv50_instmem_unmap;
 360		engine->instmem.flush		= nv84_instmem_flush;
 361		engine->mc.init			= nv50_mc_init;
 362		engine->mc.takedown		= nv50_mc_takedown;
 363		engine->timer.init		= nv04_timer_init;
 364		engine->timer.read		= nv04_timer_read;
 365		engine->timer.takedown		= nv04_timer_takedown;
 366		engine->fb.init			= nvc0_fb_init;
 367		engine->fb.takedown		= nvc0_fb_takedown;
 368		engine->display.early_init	= nouveau_stub_init;
 369		engine->display.late_takedown	= nouveau_stub_takedown;
 370		engine->display.create		= nvd0_display_create;
 371		engine->display.destroy		= nvd0_display_destroy;
 372		engine->display.init		= nvd0_display_init;
 373		engine->display.fini		= nvd0_display_fini;
 374		engine->gpio.init		= nv50_gpio_init;
 375		engine->gpio.fini		= nv50_gpio_fini;
 376		engine->gpio.drive		= nvd0_gpio_drive;
 377		engine->gpio.sense		= nvd0_gpio_sense;
 378		engine->gpio.irq_enable		= nv50_gpio_irq_enable;
 379		engine->vram.init		= nvc0_vram_init;
 380		engine->vram.takedown		= nv50_vram_fini;
 381		engine->vram.get		= nvc0_vram_new;
 382		engine->vram.put		= nv50_vram_del;
 383		engine->vram.flags_valid	= nvc0_vram_flags_valid;
 384		engine->pm.temp_get		= nv84_temp_get;
 385		engine->pm.clocks_get		= nvc0_pm_clocks_get;
 386		engine->pm.clocks_pre		= nvc0_pm_clocks_pre;
 387		engine->pm.clocks_set		= nvc0_pm_clocks_set;
 388		engine->pm.voltage_get		= nouveau_voltage_gpio_get;
 389		engine->pm.voltage_set		= nouveau_voltage_gpio_set;
 390		break;
 391	case 0xe0:
 392		engine->instmem.init		= nvc0_instmem_init;
 393		engine->instmem.takedown	= nvc0_instmem_takedown;
 394		engine->instmem.suspend		= nvc0_instmem_suspend;
 395		engine->instmem.resume		= nvc0_instmem_resume;
 396		engine->instmem.get		= nv50_instmem_get;
 397		engine->instmem.put		= nv50_instmem_put;
 398		engine->instmem.map		= nv50_instmem_map;
 399		engine->instmem.unmap		= nv50_instmem_unmap;
 400		engine->instmem.flush		= nv84_instmem_flush;
 401		engine->mc.init			= nv50_mc_init;
 402		engine->mc.takedown		= nv50_mc_takedown;
 403		engine->timer.init		= nv04_timer_init;
 404		engine->timer.read		= nv04_timer_read;
 405		engine->timer.takedown		= nv04_timer_takedown;
 406		engine->fb.init			= nvc0_fb_init;
 407		engine->fb.takedown		= nvc0_fb_takedown;
 408		engine->display.early_init	= nouveau_stub_init;
 409		engine->display.late_takedown	= nouveau_stub_takedown;
 410		engine->display.create		= nvd0_display_create;
 411		engine->display.destroy		= nvd0_display_destroy;
 412		engine->display.init		= nvd0_display_init;
 413		engine->display.fini		= nvd0_display_fini;
 414		engine->gpio.init		= nv50_gpio_init;
 415		engine->gpio.fini		= nv50_gpio_fini;
 416		engine->gpio.drive		= nvd0_gpio_drive;
 417		engine->gpio.sense		= nvd0_gpio_sense;
 418		engine->gpio.irq_enable		= nv50_gpio_irq_enable;
 419		engine->vram.init		= nvc0_vram_init;
 420		engine->vram.takedown		= nv50_vram_fini;
 421		engine->vram.get		= nvc0_vram_new;
 422		engine->vram.put		= nv50_vram_del;
 423		engine->vram.flags_valid	= nvc0_vram_flags_valid;
 424		break;
 425	default:
 426		NV_ERROR(dev, "NV%02x unsupported\n", dev_priv->chipset);
 427		return 1;
 428	}
 429
 430	/* headless mode */
 431	if (nouveau_modeset == 2) {
 432		engine->display.early_init = nouveau_stub_init;
 433		engine->display.late_takedown = nouveau_stub_takedown;
 434		engine->display.create = nouveau_stub_init;
 435		engine->display.init = nouveau_stub_init;
 436		engine->display.destroy = nouveau_stub_takedown;
 437	}
 438
 439	return 0;
 440}
 441
 442static unsigned int
 443nouveau_vga_set_decode(void *priv, bool state)
 444{
 445	struct drm_device *dev = priv;
 446	struct drm_nouveau_private *dev_priv = dev->dev_private;
 447
 448	if (dev_priv->chipset >= 0x40)
 449		nv_wr32(dev, 0x88054, state);
 450	else
 451		nv_wr32(dev, 0x1854, state);
 452
 453	if (state)
 454		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
 455		       VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
 456	else
 457		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
 458}
 459
 460static void nouveau_switcheroo_set_state(struct pci_dev *pdev,
 461					 enum vga_switcheroo_state state)
 462{
 463	struct drm_device *dev = pci_get_drvdata(pdev);
 464	pm_message_t pmm = { .event = PM_EVENT_SUSPEND };
 465	if (state == VGA_SWITCHEROO_ON) {
 466		printk(KERN_ERR "VGA switcheroo: switched nouveau on\n");
 467		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 468		nouveau_pci_resume(pdev);
 469		drm_kms_helper_poll_enable(dev);
 470		dev->switch_power_state = DRM_SWITCH_POWER_ON;
 471	} else {
 472		printk(KERN_ERR "VGA switcheroo: switched nouveau off\n");
 473		dev->switch_power_state = DRM_SWITCH_POWER_CHANGING;
 474		drm_kms_helper_poll_disable(dev);
 475		nouveau_switcheroo_optimus_dsm();
 476		nouveau_pci_suspend(pdev, pmm);
 477		dev->switch_power_state = DRM_SWITCH_POWER_OFF;
 478	}
 479}
 480
 481static void nouveau_switcheroo_reprobe(struct pci_dev *pdev)
 482{
 483	struct drm_device *dev = pci_get_drvdata(pdev);
 484	nouveau_fbcon_output_poll_changed(dev);
 485}
 486
 487static bool nouveau_switcheroo_can_switch(struct pci_dev *pdev)
 488{
 489	struct drm_device *dev = pci_get_drvdata(pdev);
 490	bool can_switch;
 491
 492	spin_lock(&dev->count_lock);
 493	can_switch = (dev->open_count == 0);
 494	spin_unlock(&dev->count_lock);
 495	return can_switch;
 496}
 497
 498static void
 499nouveau_card_channel_fini(struct drm_device *dev)
 500{
 501	struct drm_nouveau_private *dev_priv = dev->dev_private;
 502
 503	if (dev_priv->channel)
 504		nouveau_channel_put_unlocked(&dev_priv->channel);
 505}
 506
 507static int
 508nouveau_card_channel_init(struct drm_device *dev)
 509{
 510	struct drm_nouveau_private *dev_priv = dev->dev_private;
 511	struct nouveau_channel *chan;
 512	int ret;
 513
 514	ret = nouveau_channel_alloc(dev, &chan, NULL, NvDmaFB, NvDmaTT);
 515	dev_priv->channel = chan;
 516	if (ret)
 517		return ret;
 518	mutex_unlock(&dev_priv->channel->mutex);
 519
 520	nouveau_bo_move_init(chan);
 521	return 0;
 522}
 523
 524static const struct vga_switcheroo_client_ops nouveau_switcheroo_ops = {
 525	.set_gpu_state = nouveau_switcheroo_set_state,
 526	.reprobe = nouveau_switcheroo_reprobe,
 527	.can_switch = nouveau_switcheroo_can_switch,
 528};
 529
 530int
 531nouveau_card_init(struct drm_device *dev)
 532{
 533	struct drm_nouveau_private *dev_priv = dev->dev_private;
 534	struct nouveau_engine *engine;
 535	int ret, e = 0;
 536
 537	vga_client_register(dev->pdev, dev, NULL, nouveau_vga_set_decode);
 538	vga_switcheroo_register_client(dev->pdev, &nouveau_switcheroo_ops);
 539
 540	/* Initialise internal driver API hooks */
 541	ret = nouveau_init_engine_ptrs(dev);
 542	if (ret)
 543		goto out;
 544	engine = &dev_priv->engine;
 545	spin_lock_init(&dev_priv->channels.lock);
 546	spin_lock_init(&dev_priv->tile.lock);
 547	spin_lock_init(&dev_priv->context_switch_lock);
 548	spin_lock_init(&dev_priv->vm_lock);
 549
 550	/* Make the CRTCs and I2C buses accessible */
 551	ret = engine->display.early_init(dev);
 552	if (ret)
 553		goto out;
 554
 555	/* Parse BIOS tables / Run init tables if card not POSTed */
 556	ret = nouveau_bios_init(dev);
 557	if (ret)
 558		goto out_display_early;
 559
 560	/* workaround an odd issue on nvc1 by disabling the device's
 561	 * nosnoop capability.  hopefully won't cause issues until a
 562	 * better fix is found - assuming there is one...
 563	 */
 564	if (dev_priv->chipset == 0xc1) {
 565		nv_mask(dev, 0x00088080, 0x00000800, 0x00000000);
 566	}
 567
 568	/* PMC */
 569	ret = engine->mc.init(dev);
 570	if (ret)
 571		goto out_bios;
 572
 573	/* PTIMER */
 574	ret = engine->timer.init(dev);
 575	if (ret)
 576		goto out_mc;
 577
 578	/* PFB */
 579	ret = engine->fb.init(dev);
 580	if (ret)
 581		goto out_timer;
 582
 583	ret = engine->vram.init(dev);
 584	if (ret)
 585		goto out_fb;
 586
 587	/* PGPIO */
 588	ret = nouveau_gpio_create(dev);
 589	if (ret)
 590		goto out_vram;
 591
 592	ret = nouveau_gpuobj_init(dev);
 593	if (ret)
 594		goto out_gpio;
 595
 596	ret = engine->instmem.init(dev);
 597	if (ret)
 598		goto out_gpuobj;
 599
 600	ret = nouveau_mem_vram_init(dev);
 601	if (ret)
 602		goto out_instmem;
 603
 604	ret = nouveau_mem_gart_init(dev);
 605	if (ret)
 606		goto out_ttmvram;
 607
 608	if (!dev_priv->noaccel) {
 609		switch (dev_priv->card_type) {
 610		case NV_04:
 611			nv04_fifo_create(dev);
 612			break;
 613		case NV_10:
 614		case NV_20:
 615		case NV_30:
 616			if (dev_priv->chipset < 0x17)
 617				nv10_fifo_create(dev);
 618			else
 619				nv17_fifo_create(dev);
 620			break;
 621		case NV_40:
 622			nv40_fifo_create(dev);
 623			break;
 624		case NV_50:
 625			if (dev_priv->chipset == 0x50)
 626				nv50_fifo_create(dev);
 627			else
 628				nv84_fifo_create(dev);
 629			break;
 630		case NV_C0:
 631		case NV_D0:
 632			nvc0_fifo_create(dev);
 633			break;
 634		case NV_E0:
 635			nve0_fifo_create(dev);
 636			break;
 637		default:
 638			break;
 639		}
 640
 641		switch (dev_priv->card_type) {
 642		case NV_04:
 643			nv04_fence_create(dev);
 644			break;
 645		case NV_10:
 646		case NV_20:
 647		case NV_30:
 648		case NV_40:
 649		case NV_50:
 650			if (dev_priv->chipset < 0x84)
 651				nv10_fence_create(dev);
 652			else
 653				nv84_fence_create(dev);
 654			break;
 655		case NV_C0:
 656		case NV_D0:
 657		case NV_E0:
 658			nvc0_fence_create(dev);
 659			break;
 660		default:
 661			break;
 662		}
 663
 664		switch (dev_priv->card_type) {
 665		case NV_04:
 666		case NV_10:
 667		case NV_20:
 668		case NV_30:
 669		case NV_40:
 670			nv04_software_create(dev);
 671			break;
 672		case NV_50:
 673			nv50_software_create(dev);
 674			break;
 675		case NV_C0:
 676		case NV_D0:
 677		case NV_E0:
 678			nvc0_software_create(dev);
 679			break;
 680		default:
 681			break;
 682		}
 683
 684		switch (dev_priv->card_type) {
 685		case NV_04:
 686			nv04_graph_create(dev);
 687			break;
 688		case NV_10:
 689			nv10_graph_create(dev);
 690			break;
 691		case NV_20:
 692		case NV_30:
 693			nv20_graph_create(dev);
 694			break;
 695		case NV_40:
 696			nv40_graph_create(dev);
 697			break;
 698		case NV_50:
 699			nv50_graph_create(dev);
 700			break;
 701		case NV_C0:
 702		case NV_D0:
 703			nvc0_graph_create(dev);
 704			break;
 705		case NV_E0:
 706			nve0_graph_create(dev);
 707			break;
 708		default:
 709			break;
 710		}
 711
 712		switch (dev_priv->chipset) {
 713		case 0x84:
 714		case 0x86:
 715		case 0x92:
 716		case 0x94:
 717		case 0x96:
 718		case 0xa0:
 719			nv84_crypt_create(dev);
 720			break;
 721		case 0x98:
 722		case 0xaa:
 723		case 0xac:
 724			nv98_crypt_create(dev);
 725			break;
 726		}
 727
 728		switch (dev_priv->card_type) {
 729		case NV_50:
 730			switch (dev_priv->chipset) {
 731			case 0xa3:
 732			case 0xa5:
 733			case 0xa8:
 734			case 0xaf:
 735				nva3_copy_create(dev);
 736				break;
 737			}
 738			break;
 739		case NV_C0:
 740			if (!(nv_rd32(dev, 0x022500) & 0x00000200))
 741				nvc0_copy_create(dev, 1);
 742		case NV_D0:
 743			if (!(nv_rd32(dev, 0x022500) & 0x00000100))
 744				nvc0_copy_create(dev, 0);
 745			break;
 746		default:
 747			break;
 748		}
 749
 750		if (dev_priv->chipset >= 0xa3 || dev_priv->chipset == 0x98) {
 751			nv84_bsp_create(dev);
 752			nv84_vp_create(dev);
 753			nv98_ppp_create(dev);
 754		} else
 755		if (dev_priv->chipset >= 0x84) {
 756			nv50_mpeg_create(dev);
 757			nv84_bsp_create(dev);
 758			nv84_vp_create(dev);
 759		} else
 760		if (dev_priv->chipset >= 0x50) {
 761			nv50_mpeg_create(dev);
 762		} else
 763		if (dev_priv->card_type == NV_40 ||
 764		    dev_priv->chipset == 0x31 ||
 765		    dev_priv->chipset == 0x34 ||
 766		    dev_priv->chipset == 0x36) {
 767			nv31_mpeg_create(dev);
 768		}
 769
 770		for (e = 0; e < NVOBJ_ENGINE_NR; e++) {
 771			if (dev_priv->eng[e]) {
 772				ret = dev_priv->eng[e]->init(dev, e);
 773				if (ret)
 774					goto out_engine;
 775			}
 776		}
 777	}
 778
 779	ret = nouveau_irq_init(dev);
 780	if (ret)
 781		goto out_engine;
 782
 783	ret = nouveau_display_create(dev);
 784	if (ret)
 785		goto out_irq;
 786
 787	nouveau_backlight_init(dev);
 788	nouveau_pm_init(dev);
 789
 790	if (dev_priv->eng[NVOBJ_ENGINE_GR]) {
 791		ret = nouveau_card_channel_init(dev);
 792		if (ret)
 793			goto out_pm;
 794	}
 795
 796	if (dev->mode_config.num_crtc) {
 797		ret = nouveau_display_init(dev);
 798		if (ret)
 799			goto out_chan;
 800
 801		nouveau_fbcon_init(dev);
 802	}
 803
 804	return 0;
 805
 806out_chan:
 807	nouveau_card_channel_fini(dev);
 808out_pm:
 809	nouveau_pm_fini(dev);
 810	nouveau_backlight_exit(dev);
 811	nouveau_display_destroy(dev);
 812out_irq:
 813	nouveau_irq_fini(dev);
 814out_engine:
 815	if (!dev_priv->noaccel) {
 816		for (e = e - 1; e >= 0; e--) {
 817			if (!dev_priv->eng[e])
 818				continue;
 819			dev_priv->eng[e]->fini(dev, e, false);
 820			dev_priv->eng[e]->destroy(dev,e );
 821		}
 822	}
 823	nouveau_mem_gart_fini(dev);
 824out_ttmvram:
 825	nouveau_mem_vram_fini(dev);
 826out_instmem:
 827	engine->instmem.takedown(dev);
 828out_gpuobj:
 829	nouveau_gpuobj_takedown(dev);
 830out_gpio:
 831	nouveau_gpio_destroy(dev);
 832out_vram:
 833	engine->vram.takedown(dev);
 834out_fb:
 835	engine->fb.takedown(dev);
 836out_timer:
 837	engine->timer.takedown(dev);
 838out_mc:
 839	engine->mc.takedown(dev);
 840out_bios:
 841	nouveau_bios_takedown(dev);
 842out_display_early:
 843	engine->display.late_takedown(dev);
 844out:
 845	vga_switcheroo_unregister_client(dev->pdev);
 846	vga_client_register(dev->pdev, NULL, NULL, NULL);
 847	return ret;
 848}
 849
 850static void nouveau_card_takedown(struct drm_device *dev)
 851{
 852	struct drm_nouveau_private *dev_priv = dev->dev_private;
 853	struct nouveau_engine *engine = &dev_priv->engine;
 854	int e;
 855
 856	if (dev->mode_config.num_crtc) {
 857		nouveau_fbcon_fini(dev);
 858		nouveau_display_fini(dev);
 859	}
 860
 861	nouveau_card_channel_fini(dev);
 862	nouveau_pm_fini(dev);
 863	nouveau_backlight_exit(dev);
 864	nouveau_display_destroy(dev);
 865
 866	if (!dev_priv->noaccel) {
 867		for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
 868			if (dev_priv->eng[e]) {
 869				dev_priv->eng[e]->fini(dev, e, false);
 870				dev_priv->eng[e]->destroy(dev,e );
 871			}
 872		}
 873	}
 874
 875	if (dev_priv->vga_ram) {
 876		nouveau_bo_unpin(dev_priv->vga_ram);
 877		nouveau_bo_ref(NULL, &dev_priv->vga_ram);
 878	}
 879
 880	mutex_lock(&dev->struct_mutex);
 881	ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_VRAM);
 882	ttm_bo_clean_mm(&dev_priv->ttm.bdev, TTM_PL_TT);
 883	mutex_unlock(&dev->struct_mutex);
 884	nouveau_mem_gart_fini(dev);
 885	nouveau_mem_vram_fini(dev);
 886
 887	engine->instmem.takedown(dev);
 888	nouveau_gpuobj_takedown(dev);
 889
 890	nouveau_gpio_destroy(dev);
 891	engine->vram.takedown(dev);
 892	engine->fb.takedown(dev);
 893	engine->timer.takedown(dev);
 894	engine->mc.takedown(dev);
 895
 896	nouveau_bios_takedown(dev);
 897	engine->display.late_takedown(dev);
 898
 899	nouveau_irq_fini(dev);
 900
 901	vga_switcheroo_unregister_client(dev->pdev);
 902	vga_client_register(dev->pdev, NULL, NULL, NULL);
 903}
 904
 905int
 906nouveau_open(struct drm_device *dev, struct drm_file *file_priv)
 907{
 908	struct drm_nouveau_private *dev_priv = dev->dev_private;
 909	struct nouveau_fpriv *fpriv;
 910	int ret;
 911
 912	fpriv = kzalloc(sizeof(*fpriv), GFP_KERNEL);
 913	if (unlikely(!fpriv))
 914		return -ENOMEM;
 915
 916	spin_lock_init(&fpriv->lock);
 917	INIT_LIST_HEAD(&fpriv->channels);
 918
 919	if (dev_priv->card_type == NV_50) {
 920		ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0020000000ULL,
 921				     &fpriv->vm);
 922		if (ret) {
 923			kfree(fpriv);
 924			return ret;
 925		}
 926	} else
 927	if (dev_priv->card_type >= NV_C0) {
 928		ret = nouveau_vm_new(dev, 0, (1ULL << 40), 0x0008000000ULL,
 929				     &fpriv->vm);
 930		if (ret) {
 931			kfree(fpriv);
 932			return ret;
 933		}
 934	}
 935
 936	file_priv->driver_priv = fpriv;
 937	return 0;
 938}
 939
 940/* here a client dies, release the stuff that was allocated for its
 941 * file_priv */
 942void nouveau_preclose(struct drm_device *dev, struct drm_file *file_priv)
 943{
 944	nouveau_channel_cleanup(dev, file_priv);
 945}
 946
 947void
 948nouveau_postclose(struct drm_device *dev, struct drm_file *file_priv)
 949{
 950	struct nouveau_fpriv *fpriv = nouveau_fpriv(file_priv);
 951	nouveau_vm_ref(NULL, &fpriv->vm, NULL);
 952	kfree(fpriv);
 953}
 954
 955/* first module load, setup the mmio/fb mapping */
 956/* KMS: we need mmio at load time, not when the first drm client opens. */
 957int nouveau_firstopen(struct drm_device *dev)
 958{
 959	return 0;
 960}
 961
 962/* if we have an OF card, copy vbios to RAMIN */
 963static void nouveau_OF_copy_vbios_to_ramin(struct drm_device *dev)
 964{
 965#if defined(__powerpc__)
 966	int size, i;
 967	const uint32_t *bios;
 968	struct device_node *dn = pci_device_to_OF_node(dev->pdev);
 969	if (!dn) {
 970		NV_INFO(dev, "Unable to get the OF node\n");
 971		return;
 972	}
 973
 974	bios = of_get_property(dn, "NVDA,BMP", &size);
 975	if (bios) {
 976		for (i = 0; i < size; i += 4)
 977			nv_wi32(dev, i, bios[i/4]);
 978		NV_INFO(dev, "OF bios successfully copied (%d bytes)\n", size);
 979	} else {
 980		NV_INFO(dev, "Unable to get the OF bios\n");
 981	}
 982#endif
 983}
 984
 985static struct apertures_struct *nouveau_get_apertures(struct drm_device *dev)
 986{
 987	struct pci_dev *pdev = dev->pdev;
 988	struct apertures_struct *aper = alloc_apertures(3);
 989	if (!aper)
 990		return NULL;
 991
 992	aper->ranges[0].base = pci_resource_start(pdev, 1);
 993	aper->ranges[0].size = pci_resource_len(pdev, 1);
 994	aper->count = 1;
 995
 996	if (pci_resource_len(pdev, 2)) {
 997		aper->ranges[aper->count].base = pci_resource_start(pdev, 2);
 998		aper->ranges[aper->count].size = pci_resource_len(pdev, 2);
 999		aper->count++;
1000	}
1001
1002	if (pci_resource_len(pdev, 3)) {
1003		aper->ranges[aper->count].base = pci_resource_start(pdev, 3);
1004		aper->ranges[aper->count].size = pci_resource_len(pdev, 3);
1005		aper->count++;
1006	}
1007
1008	return aper;
1009}
1010
1011static int nouveau_remove_conflicting_drivers(struct drm_device *dev)
1012{
1013	struct drm_nouveau_private *dev_priv = dev->dev_private;
1014	bool primary = false;
1015	dev_priv->apertures = nouveau_get_apertures(dev);
1016	if (!dev_priv->apertures)
1017		return -ENOMEM;
1018
1019#ifdef CONFIG_X86
1020	primary = dev->pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW;
1021#endif
1022
1023	remove_conflicting_framebuffers(dev_priv->apertures, "nouveaufb", primary);
1024	return 0;
1025}
1026
1027int nouveau_load(struct drm_device *dev, unsigned long flags)
1028{
1029	struct drm_nouveau_private *dev_priv;
1030	unsigned long long offset, length;
1031	uint32_t reg0 = ~0, strap;
1032	int ret;
1033
1034	dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL);
1035	if (!dev_priv) {
1036		ret = -ENOMEM;
1037		goto err_out;
1038	}
1039	dev->dev_private = dev_priv;
1040	dev_priv->dev = dev;
1041
1042	pci_set_master(dev->pdev);
1043
1044	dev_priv->flags = flags & NOUVEAU_FLAGS;
1045
1046	NV_DEBUG(dev, "vendor: 0x%X device: 0x%X class: 0x%X\n",
1047		 dev->pci_vendor, dev->pci_device, dev->pdev->class);
1048
1049	/* first up, map the start of mmio and determine the chipset */
1050	dev_priv->mmio = ioremap(pci_resource_start(dev->pdev, 0), PAGE_SIZE);
1051	if (dev_priv->mmio) {
1052#ifdef __BIG_ENDIAN
1053		/* put the card into big-endian mode if it's not */
1054		if (nv_rd32(dev, NV03_PMC_BOOT_1) != 0x01000001)
1055			nv_wr32(dev, NV03_PMC_BOOT_1, 0x01000001);
1056		DRM_MEMORYBARRIER();
1057#endif
1058
1059		/* determine chipset and derive architecture from it */
1060		reg0 = nv_rd32(dev, NV03_PMC_BOOT_0);
1061		if ((reg0 & 0x0f000000) > 0) {
1062			dev_priv->chipset = (reg0 & 0xff00000) >> 20;
1063			switch (dev_priv->chipset & 0xf0) {
1064			case 0x10:
1065			case 0x20:
1066			case 0x30:
1067				dev_priv->card_type = dev_priv->chipset & 0xf0;
1068				break;
1069			case 0x40:
1070			case 0x60:
1071				dev_priv->card_type = NV_40;
1072				break;
1073			case 0x50:
1074			case 0x80:
1075			case 0x90:
1076			case 0xa0:
1077				dev_priv->card_type = NV_50;
1078				break;
1079			case 0xc0:
1080				dev_priv->card_type = NV_C0;
1081				break;
1082			case 0xd0:
1083				dev_priv->card_type = NV_D0;
1084				break;
1085			case 0xe0:
1086				dev_priv->card_type = NV_E0;
1087				break;
1088			default:
1089				break;
1090			}
1091		} else
1092		if ((reg0 & 0xff00fff0) == 0x20004000) {
1093			if (reg0 & 0x00f00000)
1094				dev_priv->chipset = 0x05;
1095			else
1096				dev_priv->chipset = 0x04;
1097			dev_priv->card_type = NV_04;
1098		}
1099
1100		iounmap(dev_priv->mmio);
1101	}
1102
1103	if (!dev_priv->card_type) {
1104		NV_ERROR(dev, "unsupported chipset 0x%08x\n", reg0);
1105		ret = -EINVAL;
1106		goto err_priv;
1107	}
1108
1109	NV_INFO(dev, "Detected an NV%02x generation card (0x%08x)\n",
1110		     dev_priv->card_type, reg0);
1111
1112	/* map the mmio regs, limiting the amount to preserve vmap space */
1113	offset = pci_resource_start(dev->pdev, 0);
1114	length = pci_resource_len(dev->pdev, 0);
1115	if (dev_priv->card_type < NV_E0)
1116		length = min(length, (unsigned long long)0x00800000);
1117
1118	dev_priv->mmio = ioremap(offset, length);
1119	if (!dev_priv->mmio) {
1120		NV_ERROR(dev, "Unable to initialize the mmio mapping. "
1121			 "Please report your setup to " DRIVER_EMAIL "\n");
1122		ret = -EINVAL;
1123		goto err_priv;
1124	}
1125	NV_DEBUG(dev, "regs mapped ok at 0x%llx\n", offset);
1126
1127	/* determine frequency of timing crystal */
1128	strap = nv_rd32(dev, 0x101000);
1129	if ( dev_priv->chipset < 0x17 ||
1130	    (dev_priv->chipset >= 0x20 && dev_priv->chipset <= 0x25))
1131		strap &= 0x00000040;
1132	else
1133		strap &= 0x00400040;
1134
1135	switch (strap) {
1136	case 0x00000000: dev_priv->crystal = 13500; break;
1137	case 0x00000040: dev_priv->crystal = 14318; break;
1138	case 0x00400000: dev_priv->crystal = 27000; break;
1139	case 0x00400040: dev_priv->crystal = 25000; break;
1140	}
1141
1142	NV_DEBUG(dev, "crystal freq: %dKHz\n", dev_priv->crystal);
1143
1144	/* Determine whether we'll attempt acceleration or not, some
1145	 * cards are disabled by default here due to them being known
1146	 * non-functional, or never been tested due to lack of hw.
1147	 */
1148	dev_priv->noaccel = !!nouveau_noaccel;
1149	if (nouveau_noaccel == -1) {
1150		switch (dev_priv->chipset) {
1151		case 0xd9: /* known broken */
1152		case 0xe4: /* needs binary driver firmware */
1153		case 0xe7: /* needs binary driver firmware */
1154			NV_INFO(dev, "acceleration disabled by default, pass "
1155				     "noaccel=0 to force enable\n");
1156			dev_priv->noaccel = true;
1157			break;
1158		default:
1159			dev_priv->noaccel = false;
1160			break;
1161		}
1162	}
1163
1164	ret = nouveau_remove_conflicting_drivers(dev);
1165	if (ret)
1166		goto err_mmio;
1167
1168	/* Map PRAMIN BAR, or on older cards, the aperture within BAR0 */
1169	if (dev_priv->card_type >= NV_40) {
1170		int ramin_bar = 2;
1171		if (pci_resource_len(dev->pdev, ramin_bar) == 0)
1172			ramin_bar = 3;
1173
1174		dev_priv->ramin_size = pci_resource_len(dev->pdev, ramin_bar);
1175		dev_priv->ramin =
1176			ioremap(pci_resource_start(dev->pdev, ramin_bar),
1177				dev_priv->ramin_size);
1178		if (!dev_priv->ramin) {
1179			NV_ERROR(dev, "Failed to map PRAMIN BAR\n");
1180			ret = -ENOMEM;
1181			goto err_mmio;
1182		}
1183	} else {
1184		dev_priv->ramin_size = 1 * 1024 * 1024;
1185		dev_priv->ramin = ioremap(offset + NV_RAMIN,
1186					  dev_priv->ramin_size);
1187		if (!dev_priv->ramin) {
1188			NV_ERROR(dev, "Failed to map BAR0 PRAMIN.\n");
1189			ret = -ENOMEM;
1190			goto err_mmio;
1191		}
1192	}
1193
1194	nouveau_OF_copy_vbios_to_ramin(dev);
1195
1196	/* Special flags */
1197	if (dev->pci_device == 0x01a0)
1198		dev_priv->flags |= NV_NFORCE;
1199	else if (dev->pci_device == 0x01f0)
1200		dev_priv->flags |= NV_NFORCE2;
1201
1202	/* For kernel modesetting, init card now and bring up fbcon */
1203	ret = nouveau_card_init(dev);
1204	if (ret)
1205		goto err_ramin;
1206
1207	return 0;
1208
1209err_ramin:
1210	iounmap(dev_priv->ramin);
1211err_mmio:
1212	iounmap(dev_priv->mmio);
1213err_priv:
1214	kfree(dev_priv);
1215	dev->dev_private = NULL;
1216err_out:
1217	return ret;
1218}
1219
1220void nouveau_lastclose(struct drm_device *dev)
1221{
1222	vga_switcheroo_process_delayed_switch();
1223}
1224
1225int nouveau_unload(struct drm_device *dev)
1226{
1227	struct drm_nouveau_private *dev_priv = dev->dev_private;
1228
1229	nouveau_card_takedown(dev);
1230
1231	iounmap(dev_priv->mmio);
1232	iounmap(dev_priv->ramin);
1233
1234	kfree(dev_priv);
1235	dev->dev_private = NULL;
1236	return 0;
1237}
1238
1239int nouveau_ioctl_getparam(struct drm_device *dev, void *data,
1240						struct drm_file *file_priv)
1241{
1242	struct drm_nouveau_private *dev_priv = dev->dev_private;
1243	struct drm_nouveau_getparam *getparam = data;
1244
1245	switch (getparam->param) {
1246	case NOUVEAU_GETPARAM_CHIPSET_ID:
1247		getparam->value = dev_priv->chipset;
1248		break;
1249	case NOUVEAU_GETPARAM_PCI_VENDOR:
1250		getparam->value = dev->pci_vendor;
1251		break;
1252	case NOUVEAU_GETPARAM_PCI_DEVICE:
1253		getparam->value = dev->pci_device;
1254		break;
1255	case NOUVEAU_GETPARAM_BUS_TYPE:
1256		if (drm_pci_device_is_agp(dev))
1257			getparam->value = NV_AGP;
1258		else if (pci_is_pcie(dev->pdev))
1259			getparam->value = NV_PCIE;
1260		else
1261			getparam->value = NV_PCI;
1262		break;
1263	case NOUVEAU_GETPARAM_FB_SIZE:
1264		getparam->value = dev_priv->fb_available_size;
1265		break;
1266	case NOUVEAU_GETPARAM_AGP_SIZE:
1267		getparam->value = dev_priv->gart_info.aper_size;
1268		break;
1269	case NOUVEAU_GETPARAM_VM_VRAM_BASE:
1270		getparam->value = 0; /* deprecated */
1271		break;
1272	case NOUVEAU_GETPARAM_PTIMER_TIME:
1273		getparam->value = dev_priv->engine.timer.read(dev);
1274		break;
1275	case NOUVEAU_GETPARAM_HAS_BO_USAGE:
1276		getparam->value = 1;
1277		break;
1278	case NOUVEAU_GETPARAM_HAS_PAGEFLIP:
1279		getparam->value = 1;
1280		break;
1281	case NOUVEAU_GETPARAM_GRAPH_UNITS:
1282		/* NV40 and NV50 versions are quite different, but register
1283		 * address is the same. User is supposed to know the card
1284		 * family anyway... */
1285		if (dev_priv->chipset >= 0x40) {
1286			getparam->value = nv_rd32(dev, NV40_PMC_GRAPH_UNITS);
1287			break;
1288		}
1289		/* FALLTHRU */
1290	default:
1291		NV_DEBUG(dev, "unknown parameter %lld\n", getparam->param);
1292		return -EINVAL;
1293	}
1294
1295	return 0;
1296}
1297
1298int
1299nouveau_ioctl_setparam(struct drm_device *dev, void *data,
1300		       struct drm_file *file_priv)
1301{
1302	struct drm_nouveau_setparam *setparam = data;
1303
1304	switch (setparam->param) {
1305	default:
1306		NV_DEBUG(dev, "unknown parameter %lld\n", setparam->param);
1307		return -EINVAL;
1308	}
1309
1310	return 0;
1311}
1312
1313/* Wait until (value(reg) & mask) == val, up until timeout has hit */
1314bool
1315nouveau_wait_eq(struct drm_device *dev, uint64_t timeout,
1316		uint32_t reg, uint32_t mask, uint32_t val)
1317{
1318	struct drm_nouveau_private *dev_priv = dev->dev_private;
1319	struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
1320	uint64_t start = ptimer->read(dev);
1321
1322	do {
1323		if ((nv_rd32(dev, reg) & mask) == val)
1324			return true;
1325	} while (ptimer->read(dev) - start < timeout);
1326
1327	return false;
1328}
1329
1330/* Wait until (value(reg) & mask) != val, up until timeout has hit */
1331bool
1332nouveau_wait_ne(struct drm_device *dev, uint64_t timeout,
1333		uint32_t reg, uint32_t mask, uint32_t val)
1334{
1335	struct drm_nouveau_private *dev_priv = dev->dev_private;
1336	struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
1337	uint64_t start = ptimer->read(dev);
1338
1339	do {
1340		if ((nv_rd32(dev, reg) & mask) != val)
1341			return true;
1342	} while (ptimer->read(dev) - start < timeout);
1343
1344	return false;
1345}
1346
1347/* Wait until cond(data) == true, up until timeout has hit */
1348bool
1349nouveau_wait_cb(struct drm_device *dev, u64 timeout,
1350		bool (*cond)(void *), void *data)
1351{
1352	struct drm_nouveau_private *dev_priv = dev->dev_private;
1353	struct nouveau_timer_engine *ptimer = &dev_priv->engine.timer;
1354	u64 start = ptimer->read(dev);
1355
1356	do {
1357		if (cond(data) == true)
1358			return true;
1359	} while (ptimer->read(dev) - start < timeout);
1360
1361	return false;
1362}
1363
1364/* Waits for PGRAPH to go completely idle */
1365bool nouveau_wait_for_idle(struct drm_device *dev)
1366{
1367	struct drm_nouveau_private *dev_priv = dev->dev_private;
1368	uint32_t mask = ~0;
1369
1370	if (dev_priv->card_type == NV_40)
1371		mask &= ~NV40_PGRAPH_STATUS_SYNC_STALL;
1372
1373	if (!nv_wait(dev, NV04_PGRAPH_STATUS, mask, 0)) {
1374		NV_ERROR(dev, "PGRAPH idle timed out with status 0x%08x\n",
1375			 nv_rd32(dev, NV04_PGRAPH_STATUS));
1376		return false;
1377	}
1378
1379	return true;
1380}
1381