aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_mem.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_mem.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mem.c75
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 */
223void 223void
224nouveau_mem_close(struct drm_device *dev) 224nouveau_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
243void
244nouveau_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
263static uint32_t 269static 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
366int 372static int
367nouveau_mem_detect(struct drm_device *dev) 373nouveau_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
502int 508int
503nouveau_mem_init(struct drm_device *dev) 509nouveau_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
589int
590nouveau_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