diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_mem.c')
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_mem.c | 75 |
1 files changed, 51 insertions, 24 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c index 6eeaeac5629..fb15a1b0dda 100644 --- a/drivers/gpu/drm/nouveau/nouveau_mem.c +++ b/drivers/gpu/drm/nouveau/nouveau_mem.c | |||
@@ -221,7 +221,7 @@ nv50_mem_vm_unbind(struct drm_device *dev, uint64_t virt, uint32_t size) | |||
221 | * Cleanup everything | 221 | * Cleanup everything |
222 | */ | 222 | */ |
223 | void | 223 | void |
224 | nouveau_mem_close(struct drm_device *dev) | 224 | nouveau_mem_vram_fini(struct drm_device *dev) |
225 | { | 225 | { |
226 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 226 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
227 | 227 | ||
@@ -232,6 +232,19 @@ nouveau_mem_close(struct drm_device *dev) | |||
232 | 232 | ||
233 | nouveau_ttm_global_release(dev_priv); | 233 | nouveau_ttm_global_release(dev_priv); |
234 | 234 | ||
235 | if (dev_priv->fb_mtrr >= 0) { | ||
236 | drm_mtrr_del(dev_priv->fb_mtrr, | ||
237 | pci_resource_start(dev->pdev, 1), | ||
238 | pci_resource_len(dev->pdev, 1), DRM_MTRR_WC); | ||
239 | dev_priv->fb_mtrr = -1; | ||
240 | } | ||
241 | } | ||
242 | |||
243 | void | ||
244 | nouveau_mem_gart_fini(struct drm_device *dev) | ||
245 | { | ||
246 | nouveau_sgdma_takedown(dev); | ||
247 | |||
235 | if (drm_core_has_AGP(dev) && dev->agp) { | 248 | if (drm_core_has_AGP(dev) && dev->agp) { |
236 | struct drm_agp_mem *entry, *tempe; | 249 | struct drm_agp_mem *entry, *tempe; |
237 | 250 | ||
@@ -251,13 +264,6 @@ nouveau_mem_close(struct drm_device *dev) | |||
251 | dev->agp->acquired = 0; | 264 | dev->agp->acquired = 0; |
252 | dev->agp->enabled = 0; | 265 | dev->agp->enabled = 0; |
253 | } | 266 | } |
254 | |||
255 | if (dev_priv->fb_mtrr) { | ||
256 | drm_mtrr_del(dev_priv->fb_mtrr, | ||
257 | pci_resource_start(dev->pdev, 1), | ||
258 | pci_resource_len(dev->pdev, 1), DRM_MTRR_WC); | ||
259 | dev_priv->fb_mtrr = -1; | ||
260 | } | ||
261 | } | 267 | } |
262 | 268 | ||
263 | static uint32_t | 269 | static uint32_t |
@@ -363,7 +369,7 @@ nvaa_vram_preinit(struct drm_device *dev) | |||
363 | dev_priv->vram_rblock_size = 1; | 369 | dev_priv->vram_rblock_size = 1; |
364 | } | 370 | } |
365 | 371 | ||
366 | int | 372 | static int |
367 | nouveau_mem_detect(struct drm_device *dev) | 373 | nouveau_mem_detect(struct drm_device *dev) |
368 | { | 374 | { |
369 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 375 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
@@ -500,24 +506,27 @@ nouveau_mem_init_agp(struct drm_device *dev) | |||
500 | } | 506 | } |
501 | 507 | ||
502 | int | 508 | int |
503 | nouveau_mem_init(struct drm_device *dev) | 509 | nouveau_mem_vram_init(struct drm_device *dev) |
504 | { | 510 | { |
505 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 511 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
506 | struct ttm_bo_device *bdev = &dev_priv->ttm.bdev; | 512 | struct ttm_bo_device *bdev = &dev_priv->ttm.bdev; |
507 | int ret, dma_bits = 32; | 513 | int ret, dma_bits; |
508 | |||
509 | dev_priv->fb_phys = pci_resource_start(dev->pdev, 1); | ||
510 | dev_priv->gart_info.type = NOUVEAU_GART_NONE; | ||
511 | 514 | ||
512 | if (dev_priv->card_type >= NV_50 && | 515 | if (dev_priv->card_type >= NV_50 && |
513 | pci_dma_supported(dev->pdev, DMA_BIT_MASK(40))) | 516 | pci_dma_supported(dev->pdev, DMA_BIT_MASK(40))) |
514 | dma_bits = 40; | 517 | dma_bits = 40; |
518 | else | ||
519 | dma_bits = 32; | ||
515 | 520 | ||
516 | ret = pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(dma_bits)); | 521 | ret = pci_set_dma_mask(dev->pdev, DMA_BIT_MASK(dma_bits)); |
517 | if (ret) { | 522 | if (ret) |
518 | NV_ERROR(dev, "Error setting DMA mask: %d\n", ret); | ||
519 | return ret; | 523 | return ret; |
520 | } | 524 | |
525 | ret = nouveau_mem_detect(dev); | ||
526 | if (ret) | ||
527 | return ret; | ||
528 | |||
529 | dev_priv->fb_phys = pci_resource_start(dev->pdev, 1); | ||
521 | 530 | ||
522 | ret = nouveau_ttm_global_init(dev_priv); | 531 | ret = nouveau_ttm_global_init(dev_priv); |
523 | if (ret) | 532 | if (ret) |
@@ -541,7 +550,16 @@ nouveau_mem_init(struct drm_device *dev) | |||
541 | pci_resource_len(dev->pdev, 1); | 550 | pci_resource_len(dev->pdev, 1); |
542 | dev_priv->fb_mappable_pages >>= PAGE_SHIFT; | 551 | dev_priv->fb_mappable_pages >>= PAGE_SHIFT; |
543 | 552 | ||
544 | /* remove reserved space at end of vram from available amount */ | 553 | /* reserve space at end of VRAM for PRAMIN */ |
554 | if (dev_priv->chipset == 0x40 || dev_priv->chipset == 0x47 || | ||
555 | dev_priv->chipset == 0x49 || dev_priv->chipset == 0x4b) | ||
556 | dev_priv->ramin_rsvd_vram = (2 * 1024 * 1024); | ||
557 | else | ||
558 | if (dev_priv->card_type >= NV_40) | ||
559 | dev_priv->ramin_rsvd_vram = (1 * 1024 * 1024); | ||
560 | else | ||
561 | dev_priv->ramin_rsvd_vram = (512 * 1024); | ||
562 | |||
545 | dev_priv->fb_available_size -= dev_priv->ramin_rsvd_vram; | 563 | dev_priv->fb_available_size -= dev_priv->ramin_rsvd_vram; |
546 | dev_priv->fb_aper_free = dev_priv->fb_available_size; | 564 | dev_priv->fb_aper_free = dev_priv->fb_available_size; |
547 | 565 | ||
@@ -562,7 +580,21 @@ nouveau_mem_init(struct drm_device *dev) | |||
562 | nouveau_bo_ref(NULL, &dev_priv->vga_ram); | 580 | nouveau_bo_ref(NULL, &dev_priv->vga_ram); |
563 | } | 581 | } |
564 | 582 | ||
565 | /* GART */ | 583 | dev_priv->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 1), |
584 | pci_resource_len(dev->pdev, 1), | ||
585 | DRM_MTRR_WC); | ||
586 | return 0; | ||
587 | } | ||
588 | |||
589 | int | ||
590 | nouveau_mem_gart_init(struct drm_device *dev) | ||
591 | { | ||
592 | struct drm_nouveau_private *dev_priv = dev->dev_private; | ||
593 | struct ttm_bo_device *bdev = &dev_priv->ttm.bdev; | ||
594 | int ret; | ||
595 | |||
596 | dev_priv->gart_info.type = NOUVEAU_GART_NONE; | ||
597 | |||
566 | #if !defined(__powerpc__) && !defined(__ia64__) | 598 | #if !defined(__powerpc__) && !defined(__ia64__) |
567 | if (drm_device_is_agp(dev) && dev->agp && !nouveau_noagp) { | 599 | if (drm_device_is_agp(dev) && dev->agp && !nouveau_noagp) { |
568 | ret = nouveau_mem_init_agp(dev); | 600 | ret = nouveau_mem_init_agp(dev); |
@@ -590,11 +622,6 @@ nouveau_mem_init(struct drm_device *dev) | |||
590 | return ret; | 622 | return ret; |
591 | } | 623 | } |
592 | 624 | ||
593 | dev_priv->fb_mtrr = drm_mtrr_add(pci_resource_start(dev->pdev, 1), | ||
594 | pci_resource_len(dev->pdev, 1), | ||
595 | DRM_MTRR_WC); | ||
596 | |||
597 | return 0; | 625 | return 0; |
598 | } | 626 | } |
599 | 627 | ||
600 | |||