[PATCHv2] drm/ttm: restructure to allow driver to plug in alternate memory manager

2010-08-18 Thread Ben Skeggs
From: Ben Skeggs 

Nouveau will need this on GeForce 8 and up to account for the GPU
reordering physical VRAM for some memory types.

v2: rebase to include nvc0_instmem.c changes

Signed-off-by: Ben Skeggs 
---
 drivers/gpu/drm/nouveau/nouveau_bo.c   |   12 ++-
 drivers/gpu/drm/nouveau/nouveau_channel.c  |6 +-
 drivers/gpu/drm/nouveau/nouveau_notifier.c |2 +-
 drivers/gpu/drm/nouveau/nouveau_sgdma.c|4 +-
 drivers/gpu/drm/nouveau/nv50_crtc.c|3 +-
 drivers/gpu/drm/nouveau/nv50_display.c |2 +-
 drivers/gpu/drm/nouveau/nv50_instmem.c |2 +-
 drivers/gpu/drm/nouveau/nvc0_instmem.c |2 +-
 drivers/gpu/drm/radeon/radeon_object.c |6 +-
 drivers/gpu/drm/radeon/radeon_ttm.c|   16 ++--
 drivers/gpu/drm/ttm/Makefile   |3 +-
 drivers/gpu/drm/ttm/ttm_agp_backend.c  |3 +-
 drivers/gpu/drm/ttm/ttm_bo.c   |  100 ---
 drivers/gpu/drm/ttm/ttm_bo_manager.c   |  148 
 drivers/gpu/drm/ttm/ttm_bo_util.c  |3 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c |3 +-
 include/drm/ttm/ttm_bo_api.h   |3 +-
 include/drm/ttm/ttm_bo_driver.h|   21 -
 18 files changed, 226 insertions(+), 113 deletions(-)
 create mode 100644 drivers/gpu/drm/ttm/ttm_bo_manager.c

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index c2497bf..522a891 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -399,6 +399,7 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, 
uint32_t type,
man->default_caching = TTM_PL_FLAG_CACHED;
break;
case TTM_PL_VRAM:
+   man->func = &ttm_bo_manager_func;
man->flags = TTM_MEMTYPE_FLAG_FIXED |
 TTM_MEMTYPE_FLAG_MAPPABLE;
man->available_caching = TTM_PL_FLAG_UNCACHED |
@@ -407,6 +408,7 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, 
uint32_t type,
man->gpu_offset = dev_priv->vm_vram_base;
break;
case TTM_PL_TT:
+   man->func = &ttm_bo_manager_func;
switch (dev_priv->gart_info.type) {
case NOUVEAU_GART_AGP:
man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
@@ -509,8 +511,8 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int 
evict, bool intr,
if (!chan || nvbo->tile_flags || nvbo->no_vm)
chan = dev_priv->channel;

-   src_offset = old_mem->mm_node->start << PAGE_SHIFT;
-   dst_offset = new_mem->mm_node->start << PAGE_SHIFT;
+   src_offset = old_mem->start << PAGE_SHIFT;
+   dst_offset = new_mem->start << PAGE_SHIFT;
if (chan != dev_priv->channel) {
if (old_mem->mem_type == TTM_PL_TT)
src_offset += dev_priv->vm_gart_base;
@@ -659,7 +661,7 @@ nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct 
ttm_mem_reg *new_mem,
return 0;
}

-   offset = new_mem->mm_node->start << PAGE_SHIFT;
+   offset = new_mem->start << PAGE_SHIFT;

if (dev_priv->card_type == NV_50) {
ret = nv50_mem_vm_bind_linear(dev,
@@ -773,14 +775,14 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, 
struct ttm_mem_reg *mem)
case TTM_PL_TT:
 #if __OS_HAS_AGP
if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) {
-   mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
+   mem->bus.offset = mem->start << PAGE_SHIFT;
mem->bus.base = dev_priv->gart_info.aper_base;
mem->bus.is_iomem = true;
}
 #endif
break;
case TTM_PL_VRAM:
-   mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
+   mem->bus.offset = mem->start << PAGE_SHIFT;
mem->bus.base = pci_resource_start(dev->pdev, 1);
mem->bus.is_iomem = true;
break;
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c 
b/drivers/gpu/drm/nouveau/nouveau_channel.c
index 90fdcda..90d3450 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)
  dev_priv->gart_info.aper_size,
  NV_DMA_ACCESS_RO, &pushbuf,
  NULL);
-   chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT;
+   chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT;
} else
if (dev_priv->card_type != NV_04) {
ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0,
 dev_priv->fb_available_size,

[PATCHv2] drm/ttm: restructure to allow driver to plug in alternate memory manager

2010-08-17 Thread Ben Skeggs
From: Ben Skeggs 

Nouveau will need this on GeForce 8 and up to account for the GPU
reordering physical VRAM for some memory types.

v2: rebase to include nvc0_instmem.c changes

Signed-off-by: Ben Skeggs 
---
 drivers/gpu/drm/nouveau/nouveau_bo.c   |   12 ++-
 drivers/gpu/drm/nouveau/nouveau_channel.c  |6 +-
 drivers/gpu/drm/nouveau/nouveau_notifier.c |2 +-
 drivers/gpu/drm/nouveau/nouveau_sgdma.c|4 +-
 drivers/gpu/drm/nouveau/nv50_crtc.c|3 +-
 drivers/gpu/drm/nouveau/nv50_display.c |2 +-
 drivers/gpu/drm/nouveau/nv50_instmem.c |2 +-
 drivers/gpu/drm/nouveau/nvc0_instmem.c |2 +-
 drivers/gpu/drm/radeon/radeon_object.c |6 +-
 drivers/gpu/drm/radeon/radeon_ttm.c|   16 ++--
 drivers/gpu/drm/ttm/Makefile   |3 +-
 drivers/gpu/drm/ttm/ttm_agp_backend.c  |3 +-
 drivers/gpu/drm/ttm/ttm_bo.c   |  100 ---
 drivers/gpu/drm/ttm/ttm_bo_manager.c   |  148 
 drivers/gpu/drm/ttm/ttm_bo_util.c  |3 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c |3 +-
 include/drm/ttm/ttm_bo_api.h   |3 +-
 include/drm/ttm/ttm_bo_driver.h|   21 -
 18 files changed, 226 insertions(+), 113 deletions(-)
 create mode 100644 drivers/gpu/drm/ttm/ttm_bo_manager.c

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index c2497bf..522a891 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -399,6 +399,7 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, 
uint32_t type,
man->default_caching = TTM_PL_FLAG_CACHED;
break;
case TTM_PL_VRAM:
+   man->func = &ttm_bo_manager_func;
man->flags = TTM_MEMTYPE_FLAG_FIXED |
 TTM_MEMTYPE_FLAG_MAPPABLE;
man->available_caching = TTM_PL_FLAG_UNCACHED |
@@ -407,6 +408,7 @@ nouveau_bo_init_mem_type(struct ttm_bo_device *bdev, 
uint32_t type,
man->gpu_offset = dev_priv->vm_vram_base;
break;
case TTM_PL_TT:
+   man->func = &ttm_bo_manager_func;
switch (dev_priv->gart_info.type) {
case NOUVEAU_GART_AGP:
man->flags = TTM_MEMTYPE_FLAG_MAPPABLE;
@@ -509,8 +511,8 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int 
evict, bool intr,
if (!chan || nvbo->tile_flags || nvbo->no_vm)
chan = dev_priv->channel;
 
-   src_offset = old_mem->mm_node->start << PAGE_SHIFT;
-   dst_offset = new_mem->mm_node->start << PAGE_SHIFT;
+   src_offset = old_mem->start << PAGE_SHIFT;
+   dst_offset = new_mem->start << PAGE_SHIFT;
if (chan != dev_priv->channel) {
if (old_mem->mem_type == TTM_PL_TT)
src_offset += dev_priv->vm_gart_base;
@@ -659,7 +661,7 @@ nouveau_bo_vm_bind(struct ttm_buffer_object *bo, struct 
ttm_mem_reg *new_mem,
return 0;
}
 
-   offset = new_mem->mm_node->start << PAGE_SHIFT;
+   offset = new_mem->start << PAGE_SHIFT;
 
if (dev_priv->card_type == NV_50) {
ret = nv50_mem_vm_bind_linear(dev,
@@ -773,14 +775,14 @@ nouveau_ttm_io_mem_reserve(struct ttm_bo_device *bdev, 
struct ttm_mem_reg *mem)
case TTM_PL_TT:
 #if __OS_HAS_AGP
if (dev_priv->gart_info.type == NOUVEAU_GART_AGP) {
-   mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
+   mem->bus.offset = mem->start << PAGE_SHIFT;
mem->bus.base = dev_priv->gart_info.aper_base;
mem->bus.is_iomem = true;
}
 #endif
break;
case TTM_PL_VRAM:
-   mem->bus.offset = mem->mm_node->start << PAGE_SHIFT;
+   mem->bus.offset = mem->start << PAGE_SHIFT;
mem->bus.base = pci_resource_start(dev->pdev, 1);
mem->bus.is_iomem = true;
break;
diff --git a/drivers/gpu/drm/nouveau/nouveau_channel.c 
b/drivers/gpu/drm/nouveau/nouveau_channel.c
index 90fdcda..90d3450 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)
  dev_priv->gart_info.aper_size,
  NV_DMA_ACCESS_RO, &pushbuf,
  NULL);
-   chan->pushbuf_base = pb->bo.mem.mm_node->start << PAGE_SHIFT;
+   chan->pushbuf_base = pb->bo.mem.start << PAGE_SHIFT;
} else
if (dev_priv->card_type != NV_04) {
ret = nouveau_gpuobj_dma_new(chan, NV_CLASS_DMA_IN_MEMORY, 0,
 dev_priv->fb_available_size,