diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_state.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_state.c | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_state.c b/drivers/gpu/drm/nouveau/nouveau_state.c index e632339c323..b02a231d693 100644 --- a/drivers/gpu/drm/nouveau/nouveau_state.c +++ b/drivers/gpu/drm/nouveau/nouveau_state.c | |||
@@ -376,12 +376,15 @@ out_err: | |||
376 | static void nouveau_switcheroo_set_state(struct pci_dev *pdev, | 376 | static void nouveau_switcheroo_set_state(struct pci_dev *pdev, |
377 | enum vga_switcheroo_state state) | 377 | enum vga_switcheroo_state state) |
378 | { | 378 | { |
379 | struct drm_device *dev = pci_get_drvdata(pdev); | ||
379 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; | 380 | pm_message_t pmm = { .event = PM_EVENT_SUSPEND }; |
380 | if (state == VGA_SWITCHEROO_ON) { | 381 | if (state == VGA_SWITCHEROO_ON) { |
381 | printk(KERN_ERR "VGA switcheroo: switched nouveau on\n"); | 382 | printk(KERN_ERR "VGA switcheroo: switched nouveau on\n"); |
382 | nouveau_pci_resume(pdev); | 383 | nouveau_pci_resume(pdev); |
384 | drm_kms_helper_poll_enable(dev); | ||
383 | } else { | 385 | } else { |
384 | printk(KERN_ERR "VGA switcheroo: switched nouveau off\n"); | 386 | printk(KERN_ERR "VGA switcheroo: switched nouveau off\n"); |
387 | drm_kms_helper_poll_disable(dev); | ||
385 | nouveau_pci_suspend(pdev, pmm); | 388 | nouveau_pci_suspend(pdev, pmm); |
386 | } | 389 | } |
387 | } | 390 | } |
@@ -776,29 +779,24 @@ int nouveau_load(struct drm_device *dev, unsigned long flags) | |||
776 | return ret; | 779 | return ret; |
777 | } | 780 | } |
778 | 781 | ||
779 | /* map larger RAMIN aperture on NV40 cards */ | 782 | /* Map PRAMIN BAR, or on older cards, the aperture withing BAR0 */ |
780 | dev_priv->ramin = NULL; | ||
781 | if (dev_priv->card_type >= NV_40) { | 783 | if (dev_priv->card_type >= NV_40) { |
782 | int ramin_bar = 2; | 784 | int ramin_bar = 2; |
783 | if (pci_resource_len(dev->pdev, ramin_bar) == 0) | 785 | if (pci_resource_len(dev->pdev, ramin_bar) == 0) |
784 | ramin_bar = 3; | 786 | ramin_bar = 3; |
785 | 787 | ||
786 | dev_priv->ramin_size = pci_resource_len(dev->pdev, ramin_bar); | 788 | dev_priv->ramin_size = pci_resource_len(dev->pdev, ramin_bar); |
787 | dev_priv->ramin = ioremap( | 789 | dev_priv->ramin = |
788 | pci_resource_start(dev->pdev, ramin_bar), | 790 | ioremap(pci_resource_start(dev->pdev, ramin_bar), |
789 | dev_priv->ramin_size); | 791 | dev_priv->ramin_size); |
790 | if (!dev_priv->ramin) { | 792 | if (!dev_priv->ramin) { |
791 | NV_ERROR(dev, "Failed to init RAMIN mapping, " | 793 | NV_ERROR(dev, "Failed to PRAMIN BAR"); |
792 | "limited instance memory available\n"); | 794 | return -ENOMEM; |
793 | } | 795 | } |
794 | } | 796 | } else { |
795 | |||
796 | /* On older cards (or if the above failed), create a map covering | ||
797 | * the BAR0 PRAMIN aperture */ | ||
798 | if (!dev_priv->ramin) { | ||
799 | dev_priv->ramin_size = 1 * 1024 * 1024; | 797 | dev_priv->ramin_size = 1 * 1024 * 1024; |
800 | dev_priv->ramin = ioremap(mmio_start_offs + NV_RAMIN, | 798 | dev_priv->ramin = ioremap(mmio_start_offs + NV_RAMIN, |
801 | dev_priv->ramin_size); | 799 | dev_priv->ramin_size); |
802 | if (!dev_priv->ramin) { | 800 | if (!dev_priv->ramin) { |
803 | NV_ERROR(dev, "Failed to map BAR0 PRAMIN.\n"); | 801 | NV_ERROR(dev, "Failed to map BAR0 PRAMIN.\n"); |
804 | return -ENOMEM; | 802 | return -ENOMEM; |
@@ -913,6 +911,9 @@ int nouveau_ioctl_getparam(struct drm_device *dev, void *data, | |||
913 | case NOUVEAU_GETPARAM_VM_VRAM_BASE: | 911 | case NOUVEAU_GETPARAM_VM_VRAM_BASE: |
914 | getparam->value = dev_priv->vm_vram_base; | 912 | getparam->value = dev_priv->vm_vram_base; |
915 | break; | 913 | break; |
914 | case NOUVEAU_GETPARAM_PTIMER_TIME: | ||
915 | getparam->value = dev_priv->engine.timer.read(dev); | ||
916 | break; | ||
916 | case NOUVEAU_GETPARAM_GRAPH_UNITS: | 917 | case NOUVEAU_GETPARAM_GRAPH_UNITS: |
917 | /* NV40 and NV50 versions are quite different, but register | 918 | /* NV40 and NV50 versions are quite different, but register |
918 | * address is the same. User is supposed to know the card | 919 | * address is the same. User is supposed to know the card |