diff options
| author | Ben Skeggs <bskeggs@redhat.com> | 2010-08-04 20:48:18 -0400 |
|---|---|---|
| committer | Ben Skeggs <bskeggs@redhat.com> | 2010-10-04 20:01:20 -0400 |
| commit | d961db75ce86a84f1f04e91ad1014653ed7d9f46 (patch) | |
| tree | a827b77524fdc0c37da70936fbb0627ac7e4b492 /drivers/gpu/drm/nouveau | |
| parent | 42311ff90dc8746bd81427b2ed6efda9af791b77 (diff) | |
drm/ttm: restructure to allow driver to plug in alternate memory manager
Nouveau will need this on GeForce 8 and up to account for the GPU
reordering physical VRAM for some memory types.
Reviewed-by: Jerome Glisse <jglisse@redhat.com>
Acked-by: Thomas Hellström <thellstrom@vmware.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_bo.c | 18 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_channel.c | 6 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_notifier.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_sgdma.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv50_crtc.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv50_display.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nv50_instmem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/nouveau/nvc0_instmem.c | 2 |
8 files changed, 20 insertions, 19 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c index f685f392c226..80353e2b8409 100644 --- a/drivers/gpu/drm/nouveau/nouveau_bo.c +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c | |||
| @@ -381,6 +381,7 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
| 381 | man->default_caching = TTM_PL_FLAG_CACHED; | 381 | man->default_caching = TTM_PL_FLAG_CACHED; |
| 382 | break; | 382 | break; |
| 383 | case TTM_PL_VRAM: | 383 | case TTM_PL_VRAM: |
| 384 | man->func = &ttm_bo_manager_func; | ||
| 384 | man->flags = TTM_MEMTYPE_FLAG_FIXED | | 385 | man->flags = TTM_MEMTYPE_FLAG_FIXED | |
| 385 | TTM_MEMTYPE_FLAG_MAPPABLE; | 386 | TTM_MEMTYPE_FLAG_MAPPABLE; |
| 386 | man->available_caching = TTM_PL_FLAG_UNCACHED | | 387 | man->available_caching = TTM_PL_FLAG_UNCACHED | |
| @@ -392,6 +393,7 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, uint32_t type, | |||
| 392 | man->gpu_offset = 0; | 393 | man->gpu_offset = 0; |
| 393 | break; | 394 | break; |
| 394 | case TTM_PL_TT: | 395 | case TTM_PL_TT: |
| 396 | man->func = &ttm_bo_manager_func; | ||
| 395 | switch (dev_priv->gart_info.type) { | 397 | switch (dev_priv->gart_info.type) { |
| 396 | case NOUVEAU_GART_AGP: | 398 | case NOUVEAU_GART_AGP: |
| 397 | man->flags = TTM_MEMTYPE_FLAG_MAPPABLE; | 399 | man->flags = TTM_MEMTYPE_FLAG_MAPPABLE; |
| @@ -494,8 +496,8 @@ nv50_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo, | |||
| 494 | u64 src_offset, dst_offset; | 496 | u64 src_offset, dst_offset; |
| 495 | int ret; | 497 | int ret; |
| 496 | 498 | ||
| 497 | src_offset = old_mem->mm_node->start << PAGE_SHIFT; | 499 | src_offset = old_mem->start << PAGE_SHIFT; |
| 498 | dst_offset = new_mem->mm_node->start << PAGE_SHIFT; | 500 | dst_offset = new_mem->start << PAGE_SHIFT; |
| 499 | if (!nvbo->no_vm) { | 501 | if (!nvbo->no_vm) { |
| 500 | if (old_mem->mem_type == TTM_PL_VRAM) | 502 | if (old_mem->mem_type == TTM_PL_VRAM) |
| 501 | src_offset += dev_priv->vm_vram_base; | 503 | src_offset += dev_priv->vm_vram_base; |
| @@ -597,8 +599,8 @@ static int | |||
| 597 | nv04_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo, | 599 | nv04_bo_move_m2mf(struct nouveau_channel *chan, struct ttm_buffer_object *bo, |
| 598 | struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) | 600 | struct ttm_mem_reg *old_mem, struct ttm_mem_reg *new_mem) |
| 599 | { | 601 | { |
| 600 | u32 src_offset = old_mem->mm_node->start << PAGE_SHIFT; | 602 | u32 src_offset = old_mem->start << PAGE_SHIFT; |
| 601 | u32 dst_offset = new_mem->mm_node->start << PAGE_SHIFT; | 603 | u32 dst_offset = new_mem->start << PAGE_SHIFT; |
| 602 | u32 page_count = new_mem->num_pages; | 604 | u32 page_count = new_mem->num_pages; |
| 603 | int ret; | 605 | int ret; |
| 604 | 606 | ||
| @@ -746,7 +748,7 @@ nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct ttm_mem_reg *new_mem, | |||
| 746 | return 0; | 748 | return 0; |
| 747 | } | 749 | } |
| 748 | 750 | ||
| 749 | offset = new_mem->mm_node->start << PAGE_SHIFT; | 751 | offset = new_mem->start << PAGE_SHIFT; |
| 750 | 752 | ||
| 751 | if (dev_priv->card_type == NV_50) { | 753 | if (dev_priv->card_type == NV_50) { |
| 752 | ret = nv50_mem_vm_bind_linear(dev, | 754 | ret = nv50_mem_vm_bind_linear(dev, |
| @@ -860,14 +862,14 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) | |||
| 860 | case TTM_PL_TT: | 862 | case TTM_PL_TT: |
| 861 | #if __OS_HAS_AGP | 863 | #if __OS_HAS_AGP |
| 862 | if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { | 864 | if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) { |
| 863 | mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; | 865 | mem->bus.offset = mem->start << PAGE_SHIFT; |
| 864 | mem->bus.base = dev_priv->gart_info.aper_base; | 866 | mem->bus.base = dev_priv->gart_info.aper_base; |
| 865 | mem->bus.is_iomem = true; | 867 | mem->bus.is_iomem = true; |
| 866 | } | 868 | } |
| 867 | #endif | 869 | #endif |
| 868 | break; | 870 | break; |
| 869 | case TTM_PL_VRAM: | 871 | case TTM_PL_VRAM: |
| 870 | mem->bus.offset = mem->mm_node->start << PAGE_SHIFT; | 872 | mem->bus.offset = mem->start << PAGE_SHIFT; |
| 871 | mem->bus.base = pci_resource_start(dev->pdev, 1); | 873 | mem->bus.base = pci_resource_start(dev->pdev, 1); |
| 872 | mem->bus.is_iomem = true; | 874 | mem->bus.is_iomem = true; |
| 873 | break; | 875 | break; |
| @@ -897,7 +899,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo) | |||
| 897 | } | 899 | } |
| 898 | 900 | ||
| 899 | /* make sure bo is in mappable vram */ | 901 | /* make sure bo is in mappable vram */ |
| 900 | if (bo->mem.mm_node->start + bo->mem.num_pages < dev_priv->fb_mappable_pages) | 902 | if (bo->mem.start + bo->mem.num_pages < dev_priv->fb_mappable_pages) |
| 901 | return 0; | 903 | return 0; |
| 902 | 904 | ||
| 903 | 905 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c b/drivers/gpu/drm/nouveau/nouveau_channel.c index 5eb4c966273f..373950e34814 100644 --- a/drivers/gpu/drm/nouveau/nouveau_channel.c +++ b/drivers/gpu/drm/nouveau/nouveau_channel.c | |||
| @@ -48,14 +48,14 @@ nouveau_channel_pushbuf_ctxdma_init(struct nouveau_channel *chan) | |||
| 48 | dev_priv->gart_info.aper_size, | 48 | dev_priv->gart_info.aper_size, |
| 49 | NV_DMA_ACCESS_RO, &pushbuf, | 49 | NV_DMA_ACCESS_RO, &pushbuf, |
| 50 | NULL); | 50 | NULL); |
| 51 | chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT; | 51 | chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT; |
| 52 | } else | 52 | } else |
| 53 | if (dev_priv->card_type != NV_04) { | 53 | if (dev_priv->card_type != NV_04) { |
| 54 | ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0, | 54 | ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0, |
| 55 | dev_priv->fb_available_size, | 55 | dev_priv->fb_available_size, |
| 56 | NV_DMA_ACCESS_RO, | 56 | NV_DMA_ACCESS_RO, |
| 57 | NV_DMA_TARGET_VIDMEM, &pushbuf); | 57 | NV_DMA_TARGET_VIDMEM, &pushbuf); |
| 58 | chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT; | 58 | chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT; |
| 59 | } else { | 59 | } else { |
| 60 | /* NV04 cmdbuf hack, from original ddx.. not sure of it's | 60 | /* NV04 cmdbuf hack, from original ddx.. not sure of it's |
| 61 | * exact reason for existing :) PCI access to cmdbuf in | 61 | * exact reason for existing :) PCI access to cmdbuf in |
| @@ -67,7 +67,7 @@ nouveau_channel_pushbuf_ctxdma_init(struct nouveau_channel *chan) | |||
| 67 | dev_priv->fb_available_size, | 67 | dev_priv->fb_available_size, |
| 68 | NV_DMA_ACCESS_RO, | 68 | NV_DMA_ACCESS_RO, |
| 69 | NV_DMA_TARGET_PCI, &pushbuf); | 69 | NV_DMA_TARGET_PCI, &pushbuf); |
| 70 | chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT; | 70 | chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT; |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | nouveau_gpuobj_ref(pushbuf, &chan->pushbuf); | 73 | nouveau_gpuobj_ref(pushbuf, &chan->pushbuf); |
diff --git a/drivers/gpu/drm/nouveau/nouveau_notifier.c b/drivers/gpu/drm/nouveau/nouveau_notifier.c index 22b86189b7bb..2cc59f8c658b 100644 --- a/drivers/gpu/drm/nouveau/nouveau_notifier.c +++ b/drivers/gpu/drm/nouveau/nouveau_notifier.c | |||
| @@ -113,7 +113,7 @@ nouveau_notifier_alloc(struct nouveau_channel *chan, uint32_t handle, | |||
| 113 | return -ENOMEM; | 113 | return -ENOMEM; |
| 114 | } | 114 | } |
| 115 | 115 | ||
| 116 | offset = chan->notifier_bo->bo.mem.mm_node->start << PAGE_SHIFT; | 116 | offset = chan->notifier_bo->bo.mem.start << PAGE_SHIFT; |
| 117 | if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_VRAM) { | 117 | if (chan->notifier_bo->bo.mem.mem_type == TTM_PL_VRAM) { |
| 118 | target = NV_DMA_TARGET_VIDMEM; | 118 | target = NV_DMA_TARGET_VIDMEM; |
| 119 | } else | 119 | } else |
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c index 7f028fee7a58..288bacac7e5a 100644 --- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c +++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c | |||
| @@ -95,9 +95,9 @@ nouveau_sgdma_bind(struct ttm_backend *be, struct ttm_mem_reg *mem) | |||
| 95 | struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma; | 95 | struct nouveau_gpuobj *gpuobj = dev_priv->gart_info.sg_ctxdma; |
| 96 | unsigned i, j, pte; | 96 | unsigned i, j, pte; |
| 97 | 97 | ||
| 98 | NV_DEBUG(dev, "pg=0x%lx\n", mem->mm_node->start); | 98 | NV_DEBUG(dev, "pg=0x%lx\n", mem->start); |
| 99 | 99 | ||
| 100 | pte = nouveau_sgdma_pte(nvbe->dev, mem->mm_node->start << PAGE_SHIFT); | 100 | pte = nouveau_sgdma_pte(nvbe->dev, mem->start << PAGE_SHIFT); |
| 101 | nvbe->pte_start = pte; | 101 | nvbe->pte_start = pte; |
| 102 | for (i = 0; i < nvbe->nr_pages; i++) { | 102 | for (i = 0; i < nvbe->nr_pages; i++) { |
| 103 | dma_addr_t dma_offset = nvbe->pages[i]; | 103 | dma_addr_t dma_offset = nvbe->pages[i]; |
diff --git a/drivers/gpu/drm/nouveau/nv50_crtc.c b/drivers/gpu/drm/nouveau/nv50_crtc.c index 1686f8291b6d..3f2fb4ec63ab 100644 --- a/drivers/gpu/drm/nouveau/nv50_crtc.c +++ b/drivers/gpu/drm/nouveau/nv50_crtc.c | |||
| @@ -104,8 +104,7 @@ nv50_crtc_blank(struct nouveau_crtc *nv_crtc, bool blanked) | |||
| 104 | OUT_RING(evo, nv_crtc->lut.depth == 8 ? | 104 | OUT_RING(evo, nv_crtc->lut.depth == 8 ? |
| 105 | NV50_EVO_CRTC_CLUT_MODE_OFF : | 105 | NV50_EVO_CRTC_CLUT_MODE_OFF : |
| 106 | NV50_EVO_CRTC_CLUT_MODE_ON); | 106 | NV50_EVO_CRTC_CLUT_MODE_ON); |
| 107 | OUT_RING(evo, (nv_crtc->lut.nvbo->bo.mem.mm_node->start << | 107 | OUT_RING(evo, (nv_crtc->lut.nvbo->bo.mem.start << PAGE_SHIFT) >> 8); |
| 108 | PAGE_SHIFT) >> 8); | ||
| 109 | if (dev_priv->chipset != 0x50) { | 108 | if (dev_priv->chipset != 0x50) { |
| 110 | BEGIN_RING(evo, 0, NV84_EVO_CRTC(index, CLUT_DMA), 1); | 109 | BEGIN_RING(evo, 0, NV84_EVO_CRTC(index, CLUT_DMA), 1); |
| 111 | OUT_RING(evo, NvEvoVRAM); | 110 | OUT_RING(evo, NvEvoVRAM); |
diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c index 11d366ad4036..55c9663ef2bf 100644 --- a/drivers/gpu/drm/nouveau/nv50_display.c +++ b/drivers/gpu/drm/nouveau/nv50_display.c | |||
| @@ -345,7 +345,7 @@ nv50_display_init(struct drm_device *dev) | |||
| 345 | 345 | ||
| 346 | /* initialise fifo */ | 346 | /* initialise fifo */ |
| 347 | nv_wr32(dev, NV50_PDISPLAY_CHANNEL_DMA_CB(0), | 347 | nv_wr32(dev, NV50_PDISPLAY_CHANNEL_DMA_CB(0), |
| 348 | ((evo->pushbuf_bo->bo.mem.mm_node->start << PAGE_SHIFT) >> 8) | | 348 | ((evo->pushbuf_bo->bo.mem.start << PAGE_SHIFT) >> 8) | |
| 349 | NV50_PDISPLAY_CHANNEL_DMA_CB_LOCATION_VRAM | | 349 | NV50_PDISPLAY_CHANNEL_DMA_CB_LOCATION_VRAM | |
| 350 | NV50_PDISPLAY_CHANNEL_DMA_CB_VALID); | 350 | NV50_PDISPLAY_CHANNEL_DMA_CB_VALID); |
| 351 | nv_wr32(dev, NV50_PDISPLAY_CHANNEL_UNK2(0), 0x00010000); | 351 | nv_wr32(dev, NV50_PDISPLAY_CHANNEL_UNK2(0), 0x00010000); |
diff --git a/drivers/gpu/drm/nouveau/nv50_instmem.c b/drivers/gpu/drm/nouveau/nv50_instmem.c index f5800f21a9dc..a53fc974332b 100644 --- a/drivers/gpu/drm/nouveau/nv50_instmem.c +++ b/drivers/gpu/drm/nouveau/nv50_instmem.c | |||
| @@ -347,7 +347,7 @@ nv50_instmem_populate(struct drm_device *dev, struct nouveau_gpuobj *gpuobj, | |||
| 347 | return ret; | 347 | return ret; |
| 348 | } | 348 | } |
| 349 | 349 | ||
| 350 | gpuobj->vinst = gpuobj->im_backing->bo.mem.mm_node->start << PAGE_SHIFT; | 350 | gpuobj->vinst = gpuobj->im_backing->bo.mem.start << PAGE_SHIFT; |
| 351 | return 0; | 351 | return 0; |
| 352 | } | 352 | } |
| 353 | 353 | ||
diff --git a/drivers/gpu/drm/nouveau/nvc0_instmem.c b/drivers/gpu/drm/nouveau/nvc0_instmem.c index 6a41d644e044..13a0f78a9088 100644 --- a/drivers/gpu/drm/nouveau/nvc0_instmem.c +++ b/drivers/gpu/drm/nouveau/nvc0_instmem.c | |||
| @@ -50,7 +50,7 @@ nvc0_instmem_populate(struct drm_device *dev, struct nouveau_gpuobj *gpuobj, | |||
| 50 | return ret; | 50 | return ret; |
| 51 | } | 51 | } |
| 52 | 52 | ||
| 53 | gpuobj->vinst = gpuobj->im_backing->bo.mem.mm_node->start << PAGE_SHIFT; | 53 | gpuobj->vinst = gpuobj->im_backing->bo.mem.start << PAGE_SHIFT; |
| 54 | return 0; | 54 | return 0; |
| 55 | } | 55 | } |
| 56 | 56 | ||
