* [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
@ 2014-08-22 8:13 Christian König
2014-08-22 8:13 ` [PATCH 2/2] drm/radeon: allow UVD to use a second 256MB segment Christian König
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Christian König @ 2014-08-22 8:13 UTC (permalink / raw)
To: dri-devel
From: Christian König <christian.koenig@amd.com>
This allows us to more fine grained specify where to place the buffer object.
Signed-off-by: Christian König <christian.koenig@amd.com>
---
drivers/gpu/drm/ast/ast_drv.h | 2 +-
drivers/gpu/drm/ast/ast_ttm.c | 20 ++--
drivers/gpu/drm/cirrus/cirrus_drv.h | 2 +-
drivers/gpu/drm/cirrus/cirrus_ttm.c | 17 ++--
drivers/gpu/drm/mgag200/mgag200_drv.h | 2 +-
drivers/gpu/drm/mgag200/mgag200_ttm.c | 20 ++--
drivers/gpu/drm/nouveau/nouveau_bo.c | 52 +++++++---
drivers/gpu/drm/nouveau/nouveau_bo.h | 4 +-
drivers/gpu/drm/nouveau/nouveau_ttm.c | 9 +-
drivers/gpu/drm/qxl/qxl_drv.h | 2 +-
drivers/gpu/drm/qxl/qxl_object.c | 17 ++--
drivers/gpu/drm/qxl/qxl_ttm.c | 8 +-
drivers/gpu/drm/radeon/radeon.h | 2 +-
drivers/gpu/drm/radeon/radeon_object.c | 71 +++++++++-----
drivers/gpu/drm/radeon/radeon_ttm.c | 25 ++---
drivers/gpu/drm/radeon/radeon_uvd.c | 8 +-
drivers/gpu/drm/ttm/ttm_bo.c | 93 ++++++++----------
drivers/gpu/drm/ttm/ttm_bo_manager.c | 9 +-
drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 136 ++++++++++++++++----------
drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c | 22 +++--
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 10 +-
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 3 +-
include/drm/ttm/ttm_bo_api.h | 40 ++++----
include/drm/ttm/ttm_bo_driver.h | 3 +-
24 files changed, 332 insertions(+), 245 deletions(-)
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 957d4fa..cb91c2a 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -316,7 +316,7 @@ struct ast_bo {
struct ttm_placement placement;
struct ttm_bo_kmap_obj kmap;
struct drm_gem_object gem;
- u32 placements[3];
+ struct ttm_place placements[3];
int pin_count;
};
#define gem_to_ast_bo(gobj) container_of((gobj), struct ast_bo, gem)
diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
index b824622..8008ea0 100644
--- a/drivers/gpu/drm/ast/ast_ttm.c
+++ b/drivers/gpu/drm/ast/ast_ttm.c
@@ -293,18 +293,22 @@ void ast_mm_fini(struct ast_private *ast)
void ast_ttm_placement(struct ast_bo *bo, int domain)
{
u32 c = 0;
- bo->placement.fpfn = 0;
- bo->placement.lpfn = 0;
+ unsigned i;
+
bo->placement.placement = bo->placements;
bo->placement.busy_placement = bo->placements;
if (domain & TTM_PL_FLAG_VRAM)
- bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
+ bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
if (domain & TTM_PL_FLAG_SYSTEM)
- bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
if (!c)
- bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
bo->placement.num_placement = c;
bo->placement.num_busy_placement = c;
+ for (i = 0; i < c; ++i) {
+ bo->placements[i].fpfn = 0;
+ bo->placements[i].lpfn = 0;
+ }
}
int ast_bo_create(struct drm_device *dev, int size, int align,
@@ -360,7 +364,7 @@ int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr)
ast_ttm_placement(bo, pl_flag);
for (i = 0; i < bo->placement.num_placement; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret)
return ret;
@@ -383,7 +387,7 @@ int ast_bo_unpin(struct ast_bo *bo)
return 0;
for (i = 0; i < bo->placement.num_placement ; i++)
- bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret)
return ret;
@@ -407,7 +411,7 @@ int ast_bo_push_sysram(struct ast_bo *bo)
ast_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
for (i = 0; i < bo->placement.num_placement ; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret) {
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index 401c890..dd2cfc9 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -163,7 +163,7 @@ struct cirrus_bo {
struct ttm_placement placement;
struct ttm_bo_kmap_obj kmap;
struct drm_gem_object gem;
- u32 placements[3];
+ struct ttm_place placements[3];
int pin_count;
};
#define gem_to_cirrus_bo(gobj) container_of((gobj), struct cirrus_bo, gem)
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
index 92e6b77..3e7d758 100644
--- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
+++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
@@ -298,18 +298,21 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
void cirrus_ttm_placement(struct cirrus_bo *bo, int domain)
{
u32 c = 0;
- bo->placement.fpfn = 0;
- bo->placement.lpfn = 0;
+ unsigned i;
bo->placement.placement = bo->placements;
bo->placement.busy_placement = bo->placements;
if (domain & TTM_PL_FLAG_VRAM)
- bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
+ bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
if (domain & TTM_PL_FLAG_SYSTEM)
- bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
if (!c)
- bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
bo->placement.num_placement = c;
bo->placement.num_busy_placement = c;
+ for (i = 0; i < c; ++i) {
+ bo->placements[i].fpfn = 0;
+ bo->placements[i].lpfn = 0;
+ }
}
int cirrus_bo_create(struct drm_device *dev, int size, int align,
@@ -365,7 +368,7 @@ int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
cirrus_ttm_placement(bo, pl_flag);
for (i = 0; i < bo->placement.num_placement; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret)
return ret;
@@ -392,7 +395,7 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
cirrus_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
for (i = 0; i < bo->placement.num_placement ; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret) {
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index 80de23d..2e2b76a 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -224,7 +224,7 @@ struct mgag200_bo {
struct ttm_placement placement;
struct ttm_bo_kmap_obj kmap;
struct drm_gem_object gem;
- u32 placements[3];
+ struct ttm_place placements[3];
int pin_count;
};
#define gem_to_mga_bo(gobj) container_of((gobj), struct mgag200_bo, gem)
diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
index 5a00e90..be883ef 100644
--- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
+++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
@@ -293,18 +293,22 @@ void mgag200_mm_fini(struct mga_device *mdev)
void mgag200_ttm_placement(struct mgag200_bo *bo, int domain)
{
u32 c = 0;
- bo->placement.fpfn = 0;
- bo->placement.lpfn = 0;
+ unsigned i;
+
bo->placement.placement = bo->placements;
bo->placement.busy_placement = bo->placements;
if (domain & TTM_PL_FLAG_VRAM)
- bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
+ bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
if (domain & TTM_PL_FLAG_SYSTEM)
- bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
if (!c)
- bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
bo->placement.num_placement = c;
bo->placement.num_busy_placement = c;
+ for (i = 0; i < c; ++i) {
+ bo->placements[i].fpfn = 0;
+ bo->placements[i].lpfn = 0;
+ }
}
int mgag200_bo_create(struct drm_device *dev, int size, int align,
@@ -361,7 +365,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
mgag200_ttm_placement(bo, pl_flag);
for (i = 0; i < bo->placement.num_placement; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret)
return ret;
@@ -384,7 +388,7 @@ int mgag200_bo_unpin(struct mgag200_bo *bo)
return 0;
for (i = 0; i < bo->placement.num_placement ; i++)
- bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret)
return ret;
@@ -408,7 +412,7 @@ int mgag200_bo_push_sysram(struct mgag200_bo *bo)
mgag200_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
for (i = 0; i < bo->placement.num_placement ; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
if (ret) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
index ba29a70..7dcd689 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -245,16 +245,16 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
}
static void
-set_placement_list(uint32_t *pl, unsigned *n, uint32_t type, uint32_t flags)
+set_placement_list(struct ttm_place *pl, unsigned *n, uint32_t type, uint32_t flags)
{
*n = 0;
if (type & TTM_PL_FLAG_VRAM)
- pl[(*n)++] = TTM_PL_FLAG_VRAM | flags;
+ pl[(*n)++].flags = TTM_PL_FLAG_VRAM | flags;
if (type & TTM_PL_FLAG_TT)
- pl[(*n)++] = TTM_PL_FLAG_TT | flags;
+ pl[(*n)++].flags = TTM_PL_FLAG_TT | flags;
if (type & TTM_PL_FLAG_SYSTEM)
- pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags;
+ pl[(*n)++].flags = TTM_PL_FLAG_SYSTEM | flags;
}
static void
@@ -263,6 +263,7 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
struct nouveau_fb *pfb = nouveau_fb(drm->device);
u32 vram_pages = pfb->ram->size >> PAGE_SHIFT;
+ unsigned i, fpfn, lpfn;
if ((nv_device(drm->device)->card_type == NV_10 ||
nv_device(drm->device)->card_type == NV_11) &&
@@ -275,11 +276,19 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
* at the same time.
*/
if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {
- nvbo->placement.fpfn = vram_pages / 2;
- nvbo->placement.lpfn = ~0;
+ fpfn = vram_pages / 2;
+ lpfn = ~0;
} else {
- nvbo->placement.fpfn = 0;
- nvbo->placement.lpfn = vram_pages / 2;
+ fpfn = 0;
+ lpfn = vram_pages / 2;
+ }
+ for (i = 0; i < nvbo->placement.num_placement; ++i) {
+ nvbo->placements[i].fpfn = fpfn;
+ nvbo->placements[i].lpfn = lpfn;
+ }
+ for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
+ nvbo->busy_placements[i].fpfn = fpfn;
+ nvbo->busy_placements[i].lpfn = lpfn;
}
}
}
@@ -1040,12 +1049,15 @@ static int
nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
bool no_wait_gpu, struct ttm_mem_reg *new_mem)
{
- u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
+ struct ttm_place placement_memtype = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
+ };
struct ttm_placement placement;
struct ttm_mem_reg tmp_mem;
int ret;
- placement.fpfn = placement.lpfn = 0;
placement.num_placement = placement.num_busy_placement = 1;
placement.placement = placement.busy_placement = &placement_memtype;
@@ -1073,12 +1085,15 @@ static int
nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
bool no_wait_gpu, struct ttm_mem_reg *new_mem)
{
- u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
+ struct ttm_place placement_memtype = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
+ };
struct ttm_placement placement;
struct ttm_mem_reg tmp_mem;
int ret;
- placement.fpfn = placement.lpfn = 0;
placement.num_placement = placement.num_busy_placement = 1;
placement.placement = placement.busy_placement = &placement_memtype;
@@ -1294,7 +1309,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
struct nouveau_bo *nvbo = nouveau_bo(bo);
struct nouveau_device *device = nv_device(drm->device);
u32 mappable = nv_device_resource_len(device, 1) >> PAGE_SHIFT;
- int ret;
+ int i, ret;
/* as long as the bo isn't in vram, and isn't tiled, we've got
* nothing to do here.
@@ -1319,9 +1334,16 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
bo->mem.start + bo->mem.num_pages < mappable)
return 0;
+ for (i = 0; i < nvbo->placement.num_placement; ++i) {
+ nvbo->placements[i].fpfn = 0;
+ nvbo->placements[i].lpfn = mappable;
+ }
+
+ for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
+ nvbo->busy_placements[i].fpfn = 0;
+ nvbo->busy_placements[i].lpfn = mappable;
+ }
- nvbo->placement.fpfn = 0;
- nvbo->placement.lpfn = mappable;
nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_VRAM, 0);
return nouveau_bo_validate(nvbo, false, false);
}
diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h b/drivers/gpu/drm/nouveau/nouveau_bo.h
index ff17c1f..4ef88e8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.h
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.h
@@ -9,8 +9,8 @@ struct nouveau_bo {
struct ttm_buffer_object bo;
struct ttm_placement placement;
u32 valid_domains;
- u32 placements[3];
- u32 busy_placements[3];
+ struct ttm_place placements[3];
+ struct ttm_place busy_placements[3];
struct ttm_bo_kmap_obj kmap;
struct list_head head;
diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
index 7e185c1..e714f7b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
@@ -75,8 +75,7 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
static int
nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
- uint32_t flags,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem)
{
struct nouveau_drm *drm = nouveau_bdev(man->bdev);
@@ -162,8 +161,7 @@ nouveau_gart_manager_del(struct ttm_mem_type_manager *man,
static int
nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
- uint32_t flags,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem)
{
struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
@@ -243,8 +241,7 @@ nv04_gart_manager_del(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem)
static int
nv04_gart_manager_new(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
- uint32_t flags,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem)
{
struct nouveau_mem *node;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 36ed40b..f6022b7 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -106,7 +106,7 @@ struct qxl_bo {
/* Protected by gem.mutex */
struct list_head list;
/* Protected by tbo.reserved */
- u32 placements[3];
+ struct ttm_place placements[3];
struct ttm_placement placement;
struct ttm_buffer_object tbo;
struct ttm_bo_kmap_obj kmap;
diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
index b95f144..adad12d 100644
--- a/drivers/gpu/drm/qxl/qxl_object.c
+++ b/drivers/gpu/drm/qxl/qxl_object.c
@@ -55,21 +55,24 @@ void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned)
{
u32 c = 0;
u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0;
+ unsigned i;
- qbo->placement.fpfn = 0;
- qbo->placement.lpfn = 0;
qbo->placement.placement = qbo->placements;
qbo->placement.busy_placement = qbo->placements;
if (domain == QXL_GEM_DOMAIN_VRAM)
- qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag;
+ qbo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag;
if (domain == QXL_GEM_DOMAIN_SURFACE)
- qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag;
+ qbo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag;
if (domain == QXL_GEM_DOMAIN_CPU)
- qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag;
+ qbo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag;
if (!c)
- qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ qbo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
qbo->placement.num_placement = c;
qbo->placement.num_busy_placement = c;
+ for (i = 0; i < c; ++i) {
+ qbo->placements[i].fpfn = 0;
+ qbo->placements[i].lpfn = 0;
+ }
}
@@ -259,7 +262,7 @@ int qxl_bo_unpin(struct qxl_bo *bo)
if (bo->pin_count)
return 0;
for (i = 0; i < bo->placement.num_placement; i++)
- bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
+ bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
if (unlikely(r != 0))
dev_err(qdev->dev, "%p validate failed for unpin\n", bo);
diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
index 71a1bae..f66c59b 100644
--- a/drivers/gpu/drm/qxl/qxl_ttm.c
+++ b/drivers/gpu/drm/qxl/qxl_ttm.c
@@ -188,11 +188,13 @@ static void qxl_evict_flags(struct ttm_buffer_object *bo,
struct ttm_placement *placement)
{
struct qxl_bo *qbo;
- static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ static struct ttm_place placements = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
+ };
if (!qxl_ttm_bo_is_qxl_bo(bo)) {
- placement->fpfn = 0;
- placement->lpfn = 0;
placement->placement = &placements;
placement->busy_placement = &placements;
placement->num_placement = 1;
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 542da82..cae3adc 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -468,7 +468,7 @@ struct radeon_bo {
struct list_head list;
/* Protected by tbo.reserved */
u32 initial_domain;
- u32 placements[3];
+ struct ttm_place placements[3];
struct ttm_placement placement;
struct ttm_buffer_object tbo;
struct ttm_bo_kmap_obj kmap;
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 2875238..0129c7e 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -97,40 +97,56 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
{
u32 c = 0, i;
- rbo->placement.fpfn = 0;
- rbo->placement.lpfn = 0;
rbo->placement.placement = rbo->placements;
rbo->placement.busy_placement = rbo->placements;
if (domain & RADEON_GEM_DOMAIN_VRAM)
- rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
- TTM_PL_FLAG_VRAM;
+ rbo->placements[c++].flags = TTM_PL_FLAG_WC |
+ TTM_PL_FLAG_UNCACHED |
+ TTM_PL_FLAG_VRAM;
+
if (domain & RADEON_GEM_DOMAIN_GTT) {
if (rbo->flags & RADEON_GEM_GTT_UC) {
- rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_TT;
+ rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
+ TTM_PL_FLAG_TT;
+
} else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
(rbo->rdev->flags & RADEON_IS_AGP)) {
- rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
+ rbo->placements[c++].flags = TTM_PL_FLAG_WC |
+ TTM_PL_FLAG_UNCACHED |
TTM_PL_FLAG_TT;
} else {
- rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
+ rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
+ TTM_PL_FLAG_TT;
}
}
+
if (domain & RADEON_GEM_DOMAIN_CPU) {
if (rbo->flags & RADEON_GEM_GTT_UC) {
- rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_SYSTEM;
+ rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
+ TTM_PL_FLAG_SYSTEM;
+
} else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
rbo->rdev->flags & RADEON_IS_AGP) {
- rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
+ rbo->placements[c++].flags = TTM_PL_FLAG_WC |
+ TTM_PL_FLAG_UNCACHED |
TTM_PL_FLAG_SYSTEM;
} else {
- rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM;
+ rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
+ TTM_PL_FLAG_SYSTEM;
}
}
if (!c)
- rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+ rbo->placements[c++].flags = TTM_PL_MASK_CACHING |
+ TTM_PL_FLAG_SYSTEM;
+
rbo->placement.num_placement = c;
rbo->placement.num_busy_placement = c;
+ for (i = 0; i < c; ++i) {
+ rbo->placements[i].fpfn = 0;
+ rbo->placements[i].lpfn = 0;
+ }
+
/*
* Use two-ended allocation depending on the buffer size to
* improve fragmentation quality.
@@ -138,7 +154,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
*/
if (rbo->tbo.mem.size > 512 * 1024) {
for (i = 0; i < c; i++) {
- rbo->placements[i] |= TTM_PL_FLAG_TOPDOWN;
+ rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
}
}
}
@@ -287,21 +303,22 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
return 0;
}
radeon_ttm_placement_from_domain(bo, domain);
- if (domain == RADEON_GEM_DOMAIN_VRAM) {
+ for (i = 0; i < bo->placement.num_placement; i++) {
+ unsigned lpfn = 0;
+
/* force to pin into visible video ram */
- bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
- }
- if (max_offset) {
- u64 lpfn = max_offset >> PAGE_SHIFT;
+ if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
+ lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
+ else
+ lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
- if (!bo->placement.lpfn)
- bo->placement.lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT;
+ if (max_offset)
+ lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
- if (lpfn < bo->placement.lpfn)
- bo->placement.lpfn = lpfn;
+ bo->placements[i].lpfn = lpfn;
+ bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
}
- for (i = 0; i < bo->placement.num_placement; i++)
- bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
+
r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
if (likely(r == 0)) {
bo->pin_count = 1;
@@ -333,8 +350,10 @@ int radeon_bo_unpin(struct radeon_bo *bo)
bo->pin_count--;
if (bo->pin_count)
return 0;
- for (i = 0; i < bo->placement.num_placement; i++)
- bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
+ for (i = 0; i < bo->placement.num_placement; i++) {
+ bo->placements[i].lpfn = 0;
+ bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
+ }
r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
if (likely(r == 0)) {
if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
@@ -735,7 +754,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
/* hurrah the memory is not visible ! */
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
- rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
+ rbo->placements[0].lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
r = ttm_bo_validate(bo, &rbo->placement, false, false);
if (unlikely(r == -ENOMEM)) {
radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 12e37b1..822eb36 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -178,12 +178,15 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
static void radeon_evict_flags(struct ttm_buffer_object *bo,
struct ttm_placement *placement)
{
+ static struct ttm_place placements = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
+ };
+
struct radeon_bo *rbo;
- static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
if (!radeon_ttm_bo_is_radeon_bo(bo)) {
- placement->fpfn = 0;
- placement->lpfn = 0;
placement->placement = &placements;
placement->busy_placement = &placements;
placement->num_placement = 1;
@@ -286,20 +289,20 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
struct radeon_device *rdev;
struct ttm_mem_reg *old_mem = &bo->mem;
struct ttm_mem_reg tmp_mem;
- u32 placements;
+ struct ttm_place placements;
struct ttm_placement placement;
int r;
rdev = radeon_get_rdev(bo->bdev);
tmp_mem = *new_mem;
tmp_mem.mm_node = NULL;
- placement.fpfn = 0;
- placement.lpfn = 0;
placement.num_placement = 1;
placement.placement = &placements;
placement.num_busy_placement = 1;
placement.busy_placement = &placements;
- placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
+ placements.fpfn = 0;
+ placements.lpfn = 0;
+ placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
interruptible, no_wait_gpu);
if (unlikely(r)) {
@@ -334,19 +337,19 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
struct ttm_mem_reg *old_mem = &bo->mem;
struct ttm_mem_reg tmp_mem;
struct ttm_placement placement;
- u32 placements;
+ struct ttm_place placements;
int r;
rdev = radeon_get_rdev(bo->bdev);
tmp_mem = *new_mem;
tmp_mem.mm_node = NULL;
- placement.fpfn = 0;
- placement.lpfn = 0;
placement.num_placement = 1;
placement.placement = &placements;
placement.num_busy_placement = 1;
placement.busy_placement = &placements;
- placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
+ placements.fpfn = 0;
+ placements.lpfn = 0;
+ placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
interruptible, no_wait_gpu);
if (unlikely(r)) {
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 6bf55ec..1168de7 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -233,8 +233,12 @@ int radeon_uvd_resume(struct radeon_device *rdev)
void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo)
{
- rbo->placement.fpfn = 0 >> PAGE_SHIFT;
- rbo->placement.lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
+ int i;
+
+ for (i = 0; i < rbo->placement.num_placement; ++i) {
+ rbo->placements[i].fpfn = 0 >> PAGE_SHIFT;
+ rbo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
+ }
}
void radeon_uvd_free_handles(struct radeon_device *rdev, struct drm_file *filp)
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
index 3da89d5..b992ec3 100644
--- a/drivers/gpu/drm/ttm/ttm_bo.c
+++ b/drivers/gpu/drm/ttm/ttm_bo.c
@@ -53,12 +53,13 @@ static struct attribute ttm_bo_count = {
.mode = S_IRUGO
};
-static inline int ttm_mem_type_from_flags(uint32_t flags, uint32_t *mem_type)
+static inline int ttm_mem_type_from_place(const struct ttm_place *place,
+ uint32_t *mem_type)
{
int i;
for (i = 0; i <= TTM_PL_PRIV5; i++)
- if (flags & (1 << i)) {
+ if (place->flags & (1 << i)) {
*mem_type = i;
return 0;
}
@@ -89,12 +90,12 @@ static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo,
bo, bo->mem.num_pages, bo->mem.size >> 10,
bo->mem.size >> 20);
for (i = 0; i < placement->num_placement; i++) {
- ret = ttm_mem_type_from_flags(placement->placement[i],
+ ret = ttm_mem_type_from_place(&placement->placement[i],
&mem_type);
if (ret)
return;
pr_err(" placement[%d]=0x%08X (%d)\n",
- i, placement->placement[i], mem_type);
+ i, placement->placement[i].flags, mem_type);
ttm_mem_type_debug(bo->bdev, mem_type);
}
}
@@ -685,8 +686,6 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
evict_mem.bus.io_reserved_vm = false;
evict_mem.bus.io_reserved_count = 0;
- placement.fpfn = 0;
- placement.lpfn = 0;
placement.num_placement = 0;
placement.num_busy_placement = 0;
bdev->driver->evict_flags(bo, &placement);
@@ -774,7 +773,7 @@ EXPORT_SYMBOL(ttm_bo_mem_put);
*/
static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
uint32_t mem_type,
- struct ttm_placement *placement,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem,
bool interruptible,
bool no_wait_gpu)
@@ -784,7 +783,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
int ret;
do {
- ret = (*man->func->get_node)(man, bo, placement, 0, mem);
+ ret = (*man->func->get_node)(man, bo, place, mem);
if (unlikely(ret != 0))
return ret;
if (mem->mm_node)
@@ -827,18 +826,18 @@ static uint32_t ttm_bo_select_caching(struct ttm_mem_type_manager *man,
static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man,
uint32_t mem_type,
- uint32_t proposed_placement,
+ const struct ttm_place *place,
uint32_t *masked_placement)
{
uint32_t cur_flags = ttm_bo_type_flags(mem_type);
- if ((cur_flags & proposed_placement & TTM_PL_MASK_MEM) == 0)
+ if ((cur_flags & place->flags & TTM_PL_MASK_MEM) == 0)
return false;
- if ((proposed_placement & man->available_caching) == 0)
+ if ((place->flags & man->available_caching) == 0)
return false;
- cur_flags |= (proposed_placement & man->available_caching);
+ cur_flags |= (place->flags & man->available_caching);
*masked_placement = cur_flags;
return true;
@@ -869,15 +868,14 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
mem->mm_node = NULL;
for (i = 0; i < placement->num_placement; ++i) {
- ret = ttm_mem_type_from_flags(placement->placement[i],
- &mem_type);
+ const struct ttm_place *place = &placement->placement[i];
+
+ ret = ttm_mem_type_from_place(place, &mem_type);
if (ret)
return ret;
man = &bdev->man[mem_type];
- type_ok = ttm_bo_mt_compatible(man,
- mem_type,
- placement->placement[i],
+ type_ok = ttm_bo_mt_compatible(man, mem_type, place,
&cur_flags);
if (!type_ok)
@@ -889,7 +887,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
* Use the access and other non-mapping-related flag bits from
* the memory placement flags to the current flags
*/
- ttm_flag_masked(&cur_flags, placement->placement[i],
+ ttm_flag_masked(&cur_flags, place->flags,
~TTM_PL_MASK_MEMTYPE);
if (mem_type == TTM_PL_SYSTEM)
@@ -897,8 +895,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
if (man->has_type && man->use_type) {
type_found = true;
- ret = (*man->func->get_node)(man, bo, placement,
- cur_flags, mem);
+ ret = (*man->func->get_node)(man, bo, place, mem);
if (unlikely(ret))
return ret;
}
@@ -916,17 +913,15 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
return -EINVAL;
for (i = 0; i < placement->num_busy_placement; ++i) {
- ret = ttm_mem_type_from_flags(placement->busy_placement[i],
- &mem_type);
+ const struct ttm_place *place = &placement->busy_placement[i];
+
+ ret = ttm_mem_type_from_place(place, &mem_type);
if (ret)
return ret;
man = &bdev->man[mem_type];
if (!man->has_type)
continue;
- if (!ttm_bo_mt_compatible(man,
- mem_type,
- placement->busy_placement[i],
- &cur_flags))
+ if (!ttm_bo_mt_compatible(man, mem_type, place, &cur_flags))
continue;
cur_flags = ttm_bo_select_caching(man, bo->mem.placement,
@@ -935,7 +930,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
* Use the access and other non-mapping-related flag bits from
* the memory placement flags to the current flags
*/
- ttm_flag_masked(&cur_flags, placement->busy_placement[i],
+ ttm_flag_masked(&cur_flags, place->flags,
~TTM_PL_MASK_MEMTYPE);
if (mem_type == TTM_PL_SYSTEM) {
@@ -945,7 +940,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
return 0;
}
- ret = ttm_bo_mem_force_space(bo, mem_type, placement, mem,
+ ret = ttm_bo_mem_force_space(bo, mem_type, place, mem,
interruptible, no_wait_gpu);
if (ret == 0 && mem->mm_node) {
mem->placement = cur_flags;
@@ -1006,20 +1001,27 @@ static bool ttm_bo_mem_compat(struct ttm_placement *placement,
{
int i;
- if (mem->mm_node && placement->lpfn != 0 &&
- (mem->start < placement->fpfn ||
- mem->start + mem->num_pages > placement->lpfn))
- return false;
-
for (i = 0; i < placement->num_placement; i++) {
- *new_flags = placement->placement[i];
+ const struct ttm_place *heap = &placement->placement[i];
+ if (mem->mm_node && heap->lpfn != 0 &&
+ (mem->start < heap->fpfn ||
+ mem->start + mem->num_pages > heap->lpfn))
+ continue;
+
+ *new_flags = heap->flags;
if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
(*new_flags & mem->placement & TTM_PL_MASK_MEM))
return true;
}
for (i = 0; i < placement->num_busy_placement; i++) {
- *new_flags = placement->busy_placement[i];
+ const struct ttm_place *heap = &placement->busy_placement[i];
+ if (mem->mm_node && heap->lpfn != 0 &&
+ (mem->start < heap->fpfn ||
+ mem->start + mem->num_pages > heap->lpfn))
+ continue;
+
+ *new_flags = heap->flags;
if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
(*new_flags & mem->placement & TTM_PL_MASK_MEM))
return true;
@@ -1037,11 +1039,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
uint32_t new_flags;
lockdep_assert_held(&bo->resv->lock.base);
- /* Check that range is valid */
- if (placement->lpfn || placement->fpfn)
- if (placement->fpfn > placement->lpfn ||
- (placement->lpfn - placement->fpfn) < bo->num_pages)
- return -EINVAL;
/*
* Check whether we need to move buffer.
*/
@@ -1070,15 +1067,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
}
EXPORT_SYMBOL(ttm_bo_validate);
-int ttm_bo_check_placement(struct ttm_buffer_object *bo,
- struct ttm_placement *placement)
-{
- BUG_ON((placement->fpfn || placement->lpfn) &&
- (bo->mem.num_pages > (placement->lpfn - placement->fpfn)));
-
- return 0;
-}
-
int ttm_bo_init(struct ttm_bo_device *bdev,
struct ttm_buffer_object *bo,
unsigned long size,
@@ -1147,15 +1135,12 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
atomic_inc(&bo->glob->bo_count);
drm_vma_node_reset(&bo->vma_node);
- ret = ttm_bo_check_placement(bo, placement);
-
/*
* For ttm_bo_type_device buffers, allocate
* address space from the device.
*/
- if (likely(!ret) &&
- (bo->type == ttm_bo_type_device ||
- bo->type == ttm_bo_type_sg))
+ if (bo->type == ttm_bo_type_device ||
+ bo->type == ttm_bo_type_sg)
ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node,
bo->mem.num_pages);
diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c
index 9e103a48..964387f 100644
--- a/drivers/gpu/drm/ttm/ttm_bo_manager.c
+++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c
@@ -49,8 +49,7 @@ struct ttm_range_manager {
static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
- uint32_t flags,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem)
{
struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
@@ -60,7 +59,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
unsigned long lpfn;
int ret;
- lpfn = placement->lpfn;
+ lpfn = place->lpfn;
if (!lpfn)
lpfn = man->size;
@@ -68,13 +67,13 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
if (!node)
return -ENOMEM;
- if (flags & TTM_PL_FLAG_TOPDOWN)
+ if (place->flags & TTM_PL_FLAG_TOPDOWN)
aflags = DRM_MM_CREATE_TOP;
spin_lock(&rman->lock);
ret = drm_mm_insert_node_in_range_generic(mm, node, mem->num_pages,
mem->page_alignment, 0,
- placement->fpfn, lpfn,
+ place->fpfn, lpfn,
DRM_MM_SEARCH_BEST,
aflags);
spin_unlock(&rman->lock);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
index 6327cfc..37c093c 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
@@ -30,66 +30,101 @@
#include <drm/ttm/ttm_placement.h>
#include <drm/ttm/ttm_page_alloc.h>
-static uint32_t vram_placement_flags = TTM_PL_FLAG_VRAM |
- TTM_PL_FLAG_CACHED;
-
-static uint32_t vram_ne_placement_flags = TTM_PL_FLAG_VRAM |
- TTM_PL_FLAG_CACHED |
- TTM_PL_FLAG_NO_EVICT;
+static struct ttm_place vram_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
+};
-static uint32_t sys_placement_flags = TTM_PL_FLAG_SYSTEM |
- TTM_PL_FLAG_CACHED;
+static struct ttm_place vram_ne_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
+};
-static uint32_t sys_ne_placement_flags = TTM_PL_FLAG_SYSTEM |
- TTM_PL_FLAG_CACHED |
- TTM_PL_FLAG_NO_EVICT;
+static struct ttm_place sys_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
+};
-static uint32_t gmr_placement_flags = VMW_PL_FLAG_GMR |
- TTM_PL_FLAG_CACHED;
+static struct ttm_place sys_ne_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
+};
-static uint32_t gmr_ne_placement_flags = VMW_PL_FLAG_GMR |
- TTM_PL_FLAG_CACHED |
- TTM_PL_FLAG_NO_EVICT;
+static struct ttm_place gmr_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
+};
-static uint32_t mob_placement_flags = VMW_PL_FLAG_MOB |
- TTM_PL_FLAG_CACHED;
+static struct ttm_place gmr_ne_placement_flags = {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
+};
-struct ttm_placement vmw_vram_placement = {
+static struct ttm_place mob_placement_flags = {
.fpfn = 0,
.lpfn = 0,
+ .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
+};
+
+struct ttm_placement vmw_vram_placement = {
.num_placement = 1,
.placement = &vram_placement_flags,
.num_busy_placement = 1,
.busy_placement = &vram_placement_flags
};
-static uint32_t vram_gmr_placement_flags[] = {
- TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
- VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
+static struct ttm_place vram_gmr_placement_flags[] = {
+ {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
+ }, {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
+ }
};
-static uint32_t gmr_vram_placement_flags[] = {
- VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED,
- TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
+static struct ttm_place gmr_vram_placement_flags[] = {
+ {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
+ }, {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
+ }
};
struct ttm_placement vmw_vram_gmr_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 2,
.placement = vram_gmr_placement_flags,
.num_busy_placement = 1,
.busy_placement = &gmr_placement_flags
};
-static uint32_t vram_gmr_ne_placement_flags[] = {
- TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT,
- VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
+static struct ttm_place vram_gmr_ne_placement_flags[] = {
+ {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED |
+ TTM_PL_FLAG_NO_EVICT
+ }, {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED |
+ TTM_PL_FLAG_NO_EVICT
+ }
};
struct ttm_placement vmw_vram_gmr_ne_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 2,
.placement = vram_gmr_ne_placement_flags,
.num_busy_placement = 1,
@@ -97,8 +132,6 @@ struct ttm_placement vmw_vram_gmr_ne_placement = {
};
struct ttm_placement vmw_vram_sys_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 1,
.placement = &vram_placement_flags,
.num_busy_placement = 1,
@@ -106,8 +139,6 @@ struct ttm_placement vmw_vram_sys_placement = {
};
struct ttm_placement vmw_vram_ne_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 1,
.placement = &vram_ne_placement_flags,
.num_busy_placement = 1,
@@ -115,8 +146,6 @@ struct ttm_placement vmw_vram_ne_placement = {
};
struct ttm_placement vmw_sys_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 1,
.placement = &sys_placement_flags,
.num_busy_placement = 1,
@@ -124,24 +153,33 @@ struct ttm_placement vmw_sys_placement = {
};
struct ttm_placement vmw_sys_ne_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 1,
.placement = &sys_ne_placement_flags,
.num_busy_placement = 1,
.busy_placement = &sys_ne_placement_flags
};
-static uint32_t evictable_placement_flags[] = {
- TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED,
- TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
- VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED,
- VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
+static struct ttm_place evictable_placement_flags[] = {
+ {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
+ }, {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
+ }, {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
+ }, {
+ .fpfn = 0,
+ .lpfn = 0,
+ .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
+ }
};
struct ttm_placement vmw_evictable_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 4,
.placement = evictable_placement_flags,
.num_busy_placement = 1,
@@ -149,8 +187,6 @@ struct ttm_placement vmw_evictable_placement = {
};
struct ttm_placement vmw_srf_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 1,
.num_busy_placement = 2,
.placement = &gmr_placement_flags,
@@ -158,8 +194,6 @@ struct ttm_placement vmw_srf_placement = {
};
struct ttm_placement vmw_mob_placement = {
- .fpfn = 0,
- .lpfn = 0,
.num_placement = 1,
.num_busy_placement = 1,
.placement = &mob_placement_flags,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
index ed1d510..914b375 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
@@ -198,13 +198,19 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *dev_priv,
{
struct ttm_buffer_object *bo = &buf->base;
struct ttm_placement placement;
+ struct ttm_place place;
int ret = 0;
if (pin)
- placement = vmw_vram_ne_placement;
+ place = vmw_vram_ne_placement.placement[0];
else
- placement = vmw_vram_placement;
- placement.lpfn = bo->num_pages;
+ place = vmw_vram_placement.placement[0];
+ place.lpfn = bo->num_pages;
+
+ placement.num_placement = 1;
+ placement.placement = &place;
+ placement.num_busy_placement = 1;
+ placement.busy_placement = &place;
ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
if (unlikely(ret != 0))
@@ -293,21 +299,23 @@ void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *bo,
*/
void vmw_bo_pin(struct ttm_buffer_object *bo, bool pin)
{
- uint32_t pl_flags;
+ struct ttm_place pl;
struct ttm_placement placement;
uint32_t old_mem_type = bo->mem.mem_type;
int ret;
lockdep_assert_held(&bo->resv->lock.base);
- pl_flags = TTM_PL_FLAG_VRAM | VMW_PL_FLAG_GMR | VMW_PL_FLAG_MOB
+ pl.fpfn = 0;
+ pl.lpfn = 0;
+ pl.flags = TTM_PL_FLAG_VRAM | VMW_PL_FLAG_GMR | VMW_PL_FLAG_MOB
| TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED;
if (pin)
- pl_flags |= TTM_PL_FLAG_NO_EVICT;
+ pl.flags |= TTM_PL_FLAG_NO_EVICT;
memset(&placement, 0, sizeof(placement));
placement.num_placement = 1;
- placement.placement = &pl_flags;
+ placement.placement = &pl;
ret = ttm_bo_validate(bo, &placement, false, true);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
index b031b48..0a474f3 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
@@ -374,10 +374,16 @@ static int vmw_fb_create_bo(struct vmw_private *vmw_priv,
size_t size, struct vmw_dma_buffer **out)
{
struct vmw_dma_buffer *vmw_bo;
- struct ttm_placement ne_placement = vmw_vram_ne_placement;
+ struct ttm_place ne_place = vmw_vram_ne_placement.placement[0];
+ struct ttm_placement ne_placement;
int ret;
- ne_placement.lpfn = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
+ ne_placement.num_placement = 1;
+ ne_placement.placement = &ne_place;
+ ne_placement.num_busy_placement = 1;
+ ne_placement.busy_placement = &ne_place;
+
+ ne_place.lpfn = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
(void) ttm_write_lock(&vmw_priv->reservation_sem, false);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
index 26f8bdd..170b61b 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
@@ -46,8 +46,7 @@ struct vmwgfx_gmrid_man {
static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
- uint32_t flags,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem)
{
struct vmwgfx_gmrid_man *gman =
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
index 7526c5b..e3d39c8 100644
--- a/include/drm/ttm/ttm_bo_api.h
+++ b/include/drm/ttm/ttm_bo_api.h
@@ -45,12 +45,24 @@ struct ttm_bo_device;
struct drm_mm_node;
+/**
+ * struct ttm_place
+ *
+ * @fpfn: first valid page frame number to put the object
+ * @lpfn: last valid page frame number to put the object
+ * @flags: memory domain and caching flags for the object
+ *
+ * Structure indicating a possible place to put an object.
+ */
+struct ttm_place {
+ unsigned fpfn;
+ unsigned lpfn;
+ uint32_t flags;
+};
/**
* struct ttm_placement
*
- * @fpfn: first valid page frame number to put the object
- * @lpfn: last valid page frame number to put the object
* @num_placement: number of preferred placements
* @placement: preferred placements
* @num_busy_placement: number of preferred placements when need to evict buffer
@@ -59,12 +71,10 @@ struct drm_mm_node;
* Structure indicating the placement you request for an object.
*/
struct ttm_placement {
- unsigned fpfn;
- unsigned lpfn;
- unsigned num_placement;
- const uint32_t *placement;
- unsigned num_busy_placement;
- const uint32_t *busy_placement;
+ unsigned num_placement;
+ const struct ttm_place *placement;
+ unsigned num_busy_placement;
+ const struct ttm_place *busy_placement;
};
/**
@@ -519,20 +529,6 @@ extern int ttm_bo_create(struct ttm_bo_device *bdev,
struct ttm_buffer_object **p_bo);
/**
- * ttm_bo_check_placement
- *
- * @bo: the buffer object.
- * @placement: placements
- *
- * Performs minimal validity checking on an intended change of
- * placement flags.
- * Returns
- * -EINVAL: Intended change is invalid or not allowed.
- */
-extern int ttm_bo_check_placement(struct ttm_buffer_object *bo,
- struct ttm_placement *placement);
-
-/**
* ttm_bo_init_mm
*
* @bdev: Pointer to a ttm_bo_device struct.
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
index 202f0a7..426bf84 100644
--- a/include/drm/ttm/ttm_bo_driver.h
+++ b/include/drm/ttm/ttm_bo_driver.h
@@ -206,8 +206,7 @@ struct ttm_mem_type_manager_func {
*/
int (*get_node)(struct ttm_mem_type_manager *man,
struct ttm_buffer_object *bo,
- struct ttm_placement *placement,
- uint32_t flags,
+ const struct ttm_place *place,
struct ttm_mem_reg *mem);
/**
--
1.9.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread* [PATCH 2/2] drm/radeon: allow UVD to use a second 256MB segment
2014-08-22 8:13 [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Christian König
@ 2014-08-22 8:13 ` Christian König
2014-08-25 15:51 ` [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Alex Deucher
2014-08-28 1:51 ` Michel Dänzer
2 siblings, 0 replies; 7+ messages in thread
From: Christian König @ 2014-08-22 8:13 UTC (permalink / raw)
To: dri-devel
From: Christian König <christian.koenig@amd.com>
This improves concurrent stream decoding.
Signed-off-by: Christian König <christian.koenig@amd.com>
---
drivers/gpu/drm/radeon/radeon.h | 3 ++-
drivers/gpu/drm/radeon/radeon_object.c | 5 +++--
drivers/gpu/drm/radeon/radeon_uvd.c | 20 ++++++++++++++++++--
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index cae3adc..f2dba50 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -1640,7 +1640,8 @@ int radeon_uvd_get_create_msg(struct radeon_device *rdev, int ring,
uint32_t handle, struct radeon_fence **fence);
int radeon_uvd_get_destroy_msg(struct radeon_device *rdev, int ring,
uint32_t handle, struct radeon_fence **fence);
-void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo);
+void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo,
+ uint32_t allowed_domains);
void radeon_uvd_free_handles(struct radeon_device *rdev,
struct drm_file *filp);
int radeon_uvd_cs_parse(struct radeon_cs_parser *parser);
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 0129c7e..c97a424 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -491,6 +491,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
bo = lobj->robj;
if (!bo->pin_count) {
u32 domain = lobj->prefered_domains;
+ u32 allowed = lobj->allowed_domains;
u32 current_domain =
radeon_mem_type_to_domain(bo->tbo.mem.mem_type);
@@ -502,7 +503,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
* into account. We don't want to disallow buffer moves
* completely.
*/
- if ((lobj->allowed_domains & current_domain) != 0 &&
+ if ((allowed & current_domain) != 0 &&
(domain & current_domain) == 0 && /* will be moved */
bytes_moved > bytes_moved_threshold) {
/* don't move it */
@@ -512,7 +513,7 @@ int radeon_bo_list_validate(struct radeon_device *rdev,
retry:
radeon_ttm_placement_from_domain(bo, domain);
if (ring == R600_RING_TYPE_UVD_INDEX)
- radeon_uvd_force_into_uvd_segment(bo);
+ radeon_uvd_force_into_uvd_segment(bo, allowed);
initial_bytes_moved = atomic64_read(&rdev->num_bytes_moved);
r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index 1168de7..d33dacc 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -231,7 +231,8 @@ int radeon_uvd_resume(struct radeon_device *rdev)
return 0;
}
-void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo)
+void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo,
+ uint32_t allowed_domains)
{
int i;
@@ -239,6 +240,21 @@ void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo)
rbo->placements[i].fpfn = 0 >> PAGE_SHIFT;
rbo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
}
+
+ /* If it must be in VRAM it must be in the first segment as well */
+ if (allowed_domains == RADEON_GEM_DOMAIN_VRAM)
+ return;
+
+ /* abort if we already have more than one placement */
+ if (rbo->placement.num_placement > 1)
+ return;
+
+ /* add another 256MB segment */
+ rbo->placements[1] = rbo->placements[0];
+ rbo->placements[1].fpfn += (256 * 1024 * 1024) >> PAGE_SHIFT;
+ rbo->placements[1].lpfn += (256 * 1024 * 1024) >> PAGE_SHIFT;
+ rbo->placement.num_placement++;
+ rbo->placement.num_busy_placement++;
}
void radeon_uvd_free_handles(struct radeon_device *rdev, struct drm_file *filp)
@@ -629,7 +645,7 @@ static int radeon_uvd_send_msg(struct radeon_device *rdev,
return r;
radeon_ttm_placement_from_domain(bo, RADEON_GEM_DOMAIN_VRAM);
- radeon_uvd_force_into_uvd_segment(bo);
+ radeon_uvd_force_into_uvd_segment(bo, RADEON_GEM_DOMAIN_VRAM);
r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
if (r)
--
1.9.1
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 7+ messages in thread* Re: [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
2014-08-22 8:13 [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Christian König
2014-08-22 8:13 ` [PATCH 2/2] drm/radeon: allow UVD to use a second 256MB segment Christian König
@ 2014-08-25 15:51 ` Alex Deucher
2014-08-26 11:28 ` Christian König
2014-08-28 1:51 ` Michel Dänzer
2 siblings, 1 reply; 7+ messages in thread
From: Alex Deucher @ 2014-08-25 15:51 UTC (permalink / raw)
To: Christian König; +Cc: Maling list - DRI developers
On Fri, Aug 22, 2014 at 4:13 AM, Christian König
<deathsimple@vodafone.de> wrote:
> From: Christian König <christian.koenig@amd.com>
>
> This allows us to more fine grained specify where to place the buffer object.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Series is:
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
> ---
> drivers/gpu/drm/ast/ast_drv.h | 2 +-
> drivers/gpu/drm/ast/ast_ttm.c | 20 ++--
> drivers/gpu/drm/cirrus/cirrus_drv.h | 2 +-
> drivers/gpu/drm/cirrus/cirrus_ttm.c | 17 ++--
> drivers/gpu/drm/mgag200/mgag200_drv.h | 2 +-
> drivers/gpu/drm/mgag200/mgag200_ttm.c | 20 ++--
> drivers/gpu/drm/nouveau/nouveau_bo.c | 52 +++++++---
> drivers/gpu/drm/nouveau/nouveau_bo.h | 4 +-
> drivers/gpu/drm/nouveau/nouveau_ttm.c | 9 +-
> drivers/gpu/drm/qxl/qxl_drv.h | 2 +-
> drivers/gpu/drm/qxl/qxl_object.c | 17 ++--
> drivers/gpu/drm/qxl/qxl_ttm.c | 8 +-
> drivers/gpu/drm/radeon/radeon.h | 2 +-
> drivers/gpu/drm/radeon/radeon_object.c | 71 +++++++++-----
> drivers/gpu/drm/radeon/radeon_ttm.c | 25 ++---
> drivers/gpu/drm/radeon/radeon_uvd.c | 8 +-
> drivers/gpu/drm/ttm/ttm_bo.c | 93 ++++++++----------
> drivers/gpu/drm/ttm/ttm_bo_manager.c | 9 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 136 ++++++++++++++++----------
> drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c | 22 +++--
> drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 10 +-
> drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 3 +-
> include/drm/ttm/ttm_bo_api.h | 40 ++++----
> include/drm/ttm/ttm_bo_driver.h | 3 +-
> 24 files changed, 332 insertions(+), 245 deletions(-)
>
> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
> index 957d4fa..cb91c2a 100644
> --- a/drivers/gpu/drm/ast/ast_drv.h
> +++ b/drivers/gpu/drm/ast/ast_drv.h
> @@ -316,7 +316,7 @@ struct ast_bo {
> struct ttm_placement placement;
> struct ttm_bo_kmap_obj kmap;
> struct drm_gem_object gem;
> - u32 placements[3];
> + struct ttm_place placements[3];
> int pin_count;
> };
> #define gem_to_ast_bo(gobj) container_of((gobj), struct ast_bo, gem)
> diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
> index b824622..8008ea0 100644
> --- a/drivers/gpu/drm/ast/ast_ttm.c
> +++ b/drivers/gpu/drm/ast/ast_ttm.c
> @@ -293,18 +293,22 @@ void ast_mm_fini(struct ast_private *ast)
> void ast_ttm_placement(struct ast_bo *bo, int domain)
> {
> u32 c = 0;
> - bo->placement.fpfn = 0;
> - bo->placement.lpfn = 0;
> + unsigned i;
> +
> bo->placement.placement = bo->placements;
> bo->placement.busy_placement = bo->placements;
> if (domain & TTM_PL_FLAG_VRAM)
> - bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
> + bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
> if (domain & TTM_PL_FLAG_SYSTEM)
> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> if (!c)
> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> bo->placement.num_placement = c;
> bo->placement.num_busy_placement = c;
> + for (i = 0; i < c; ++i) {
> + bo->placements[i].fpfn = 0;
> + bo->placements[i].lpfn = 0;
> + }
> }
>
> int ast_bo_create(struct drm_device *dev, int size, int align,
> @@ -360,7 +364,7 @@ int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr)
>
> ast_ttm_placement(bo, pl_flag);
> for (i = 0; i < bo->placement.num_placement; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret)
> return ret;
> @@ -383,7 +387,7 @@ int ast_bo_unpin(struct ast_bo *bo)
> return 0;
>
> for (i = 0; i < bo->placement.num_placement ; i++)
> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret)
> return ret;
> @@ -407,7 +411,7 @@ int ast_bo_push_sysram(struct ast_bo *bo)
>
> ast_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> for (i = 0; i < bo->placement.num_placement ; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret) {
> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
> index 401c890..dd2cfc9 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
> @@ -163,7 +163,7 @@ struct cirrus_bo {
> struct ttm_placement placement;
> struct ttm_bo_kmap_obj kmap;
> struct drm_gem_object gem;
> - u32 placements[3];
> + struct ttm_place placements[3];
> int pin_count;
> };
> #define gem_to_cirrus_bo(gobj) container_of((gobj), struct cirrus_bo, gem)
> diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> index 92e6b77..3e7d758 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
> @@ -298,18 +298,21 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
> void cirrus_ttm_placement(struct cirrus_bo *bo, int domain)
> {
> u32 c = 0;
> - bo->placement.fpfn = 0;
> - bo->placement.lpfn = 0;
> + unsigned i;
> bo->placement.placement = bo->placements;
> bo->placement.busy_placement = bo->placements;
> if (domain & TTM_PL_FLAG_VRAM)
> - bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
> + bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
> if (domain & TTM_PL_FLAG_SYSTEM)
> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> if (!c)
> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> bo->placement.num_placement = c;
> bo->placement.num_busy_placement = c;
> + for (i = 0; i < c; ++i) {
> + bo->placements[i].fpfn = 0;
> + bo->placements[i].lpfn = 0;
> + }
> }
>
> int cirrus_bo_create(struct drm_device *dev, int size, int align,
> @@ -365,7 +368,7 @@ int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
>
> cirrus_ttm_placement(bo, pl_flag);
> for (i = 0; i < bo->placement.num_placement; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret)
> return ret;
> @@ -392,7 +395,7 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
>
> cirrus_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> for (i = 0; i < bo->placement.num_placement ; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret) {
> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
> index 80de23d..2e2b76a 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
> @@ -224,7 +224,7 @@ struct mgag200_bo {
> struct ttm_placement placement;
> struct ttm_bo_kmap_obj kmap;
> struct drm_gem_object gem;
> - u32 placements[3];
> + struct ttm_place placements[3];
> int pin_count;
> };
> #define gem_to_mga_bo(gobj) container_of((gobj), struct mgag200_bo, gem)
> diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> index 5a00e90..be883ef 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
> @@ -293,18 +293,22 @@ void mgag200_mm_fini(struct mga_device *mdev)
> void mgag200_ttm_placement(struct mgag200_bo *bo, int domain)
> {
> u32 c = 0;
> - bo->placement.fpfn = 0;
> - bo->placement.lpfn = 0;
> + unsigned i;
> +
> bo->placement.placement = bo->placements;
> bo->placement.busy_placement = bo->placements;
> if (domain & TTM_PL_FLAG_VRAM)
> - bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
> + bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
> if (domain & TTM_PL_FLAG_SYSTEM)
> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> if (!c)
> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> bo->placement.num_placement = c;
> bo->placement.num_busy_placement = c;
> + for (i = 0; i < c; ++i) {
> + bo->placements[i].fpfn = 0;
> + bo->placements[i].lpfn = 0;
> + }
> }
>
> int mgag200_bo_create(struct drm_device *dev, int size, int align,
> @@ -361,7 +365,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
>
> mgag200_ttm_placement(bo, pl_flag);
> for (i = 0; i < bo->placement.num_placement; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret)
> return ret;
> @@ -384,7 +388,7 @@ int mgag200_bo_unpin(struct mgag200_bo *bo)
> return 0;
>
> for (i = 0; i < bo->placement.num_placement ; i++)
> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret)
> return ret;
> @@ -408,7 +412,7 @@ int mgag200_bo_push_sysram(struct mgag200_bo *bo)
>
> mgag200_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
> for (i = 0; i < bo->placement.num_placement ; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>
> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
> if (ret) {
> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
> index ba29a70..7dcd689 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
> @@ -245,16 +245,16 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
> }
>
> static void
> -set_placement_list(uint32_t *pl, unsigned *n, uint32_t type, uint32_t flags)
> +set_placement_list(struct ttm_place *pl, unsigned *n, uint32_t type, uint32_t flags)
> {
> *n = 0;
>
> if (type & TTM_PL_FLAG_VRAM)
> - pl[(*n)++] = TTM_PL_FLAG_VRAM | flags;
> + pl[(*n)++].flags = TTM_PL_FLAG_VRAM | flags;
> if (type & TTM_PL_FLAG_TT)
> - pl[(*n)++] = TTM_PL_FLAG_TT | flags;
> + pl[(*n)++].flags = TTM_PL_FLAG_TT | flags;
> if (type & TTM_PL_FLAG_SYSTEM)
> - pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags;
> + pl[(*n)++].flags = TTM_PL_FLAG_SYSTEM | flags;
> }
>
> static void
> @@ -263,6 +263,7 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
> struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
> struct nouveau_fb *pfb = nouveau_fb(drm->device);
> u32 vram_pages = pfb->ram->size >> PAGE_SHIFT;
> + unsigned i, fpfn, lpfn;
>
> if ((nv_device(drm->device)->card_type == NV_10 ||
> nv_device(drm->device)->card_type == NV_11) &&
> @@ -275,11 +276,19 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
> * at the same time.
> */
> if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {
> - nvbo->placement.fpfn = vram_pages / 2;
> - nvbo->placement.lpfn = ~0;
> + fpfn = vram_pages / 2;
> + lpfn = ~0;
> } else {
> - nvbo->placement.fpfn = 0;
> - nvbo->placement.lpfn = vram_pages / 2;
> + fpfn = 0;
> + lpfn = vram_pages / 2;
> + }
> + for (i = 0; i < nvbo->placement.num_placement; ++i) {
> + nvbo->placements[i].fpfn = fpfn;
> + nvbo->placements[i].lpfn = lpfn;
> + }
> + for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
> + nvbo->busy_placements[i].fpfn = fpfn;
> + nvbo->busy_placements[i].lpfn = lpfn;
> }
> }
> }
> @@ -1040,12 +1049,15 @@ static int
> nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
> bool no_wait_gpu, struct ttm_mem_reg *new_mem)
> {
> - u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
> + struct ttm_place placement_memtype = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
> + };
> struct ttm_placement placement;
> struct ttm_mem_reg tmp_mem;
> int ret;
>
> - placement.fpfn = placement.lpfn = 0;
> placement.num_placement = placement.num_busy_placement = 1;
> placement.placement = placement.busy_placement = &placement_memtype;
>
> @@ -1073,12 +1085,15 @@ static int
> nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
> bool no_wait_gpu, struct ttm_mem_reg *new_mem)
> {
> - u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
> + struct ttm_place placement_memtype = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
> + };
> struct ttm_placement placement;
> struct ttm_mem_reg tmp_mem;
> int ret;
>
> - placement.fpfn = placement.lpfn = 0;
> placement.num_placement = placement.num_busy_placement = 1;
> placement.placement = placement.busy_placement = &placement_memtype;
>
> @@ -1294,7 +1309,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
> struct nouveau_bo *nvbo = nouveau_bo(bo);
> struct nouveau_device *device = nv_device(drm->device);
> u32 mappable = nv_device_resource_len(device, 1) >> PAGE_SHIFT;
> - int ret;
> + int i, ret;
>
> /* as long as the bo isn't in vram, and isn't tiled, we've got
> * nothing to do here.
> @@ -1319,9 +1334,16 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
> bo->mem.start + bo->mem.num_pages < mappable)
> return 0;
>
> + for (i = 0; i < nvbo->placement.num_placement; ++i) {
> + nvbo->placements[i].fpfn = 0;
> + nvbo->placements[i].lpfn = mappable;
> + }
> +
> + for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
> + nvbo->busy_placements[i].fpfn = 0;
> + nvbo->busy_placements[i].lpfn = mappable;
> + }
>
> - nvbo->placement.fpfn = 0;
> - nvbo->placement.lpfn = mappable;
> nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_VRAM, 0);
> return nouveau_bo_validate(nvbo, false, false);
> }
> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h b/drivers/gpu/drm/nouveau/nouveau_bo.h
> index ff17c1f..4ef88e8 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_bo.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.h
> @@ -9,8 +9,8 @@ struct nouveau_bo {
> struct ttm_buffer_object bo;
> struct ttm_placement placement;
> u32 valid_domains;
> - u32 placements[3];
> - u32 busy_placements[3];
> + struct ttm_place placements[3];
> + struct ttm_place busy_placements[3];
> struct ttm_bo_kmap_obj kmap;
> struct list_head head;
>
> diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> index 7e185c1..e714f7b 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
> @@ -75,8 +75,7 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
> static int
> nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
> struct ttm_buffer_object *bo,
> - struct ttm_placement *placement,
> - uint32_t flags,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem)
> {
> struct nouveau_drm *drm = nouveau_bdev(man->bdev);
> @@ -162,8 +161,7 @@ nouveau_gart_manager_del(struct ttm_mem_type_manager *man,
> static int
> nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
> struct ttm_buffer_object *bo,
> - struct ttm_placement *placement,
> - uint32_t flags,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem)
> {
> struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
> @@ -243,8 +241,7 @@ nv04_gart_manager_del(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem)
> static int
> nv04_gart_manager_new(struct ttm_mem_type_manager *man,
> struct ttm_buffer_object *bo,
> - struct ttm_placement *placement,
> - uint32_t flags,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem)
> {
> struct nouveau_mem *node;
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 36ed40b..f6022b7 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -106,7 +106,7 @@ struct qxl_bo {
> /* Protected by gem.mutex */
> struct list_head list;
> /* Protected by tbo.reserved */
> - u32 placements[3];
> + struct ttm_place placements[3];
> struct ttm_placement placement;
> struct ttm_buffer_object tbo;
> struct ttm_bo_kmap_obj kmap;
> diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
> index b95f144..adad12d 100644
> --- a/drivers/gpu/drm/qxl/qxl_object.c
> +++ b/drivers/gpu/drm/qxl/qxl_object.c
> @@ -55,21 +55,24 @@ void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned)
> {
> u32 c = 0;
> u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0;
> + unsigned i;
>
> - qbo->placement.fpfn = 0;
> - qbo->placement.lpfn = 0;
> qbo->placement.placement = qbo->placements;
> qbo->placement.busy_placement = qbo->placements;
> if (domain == QXL_GEM_DOMAIN_VRAM)
> - qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag;
> + qbo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag;
> if (domain == QXL_GEM_DOMAIN_SURFACE)
> - qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag;
> + qbo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag;
> if (domain == QXL_GEM_DOMAIN_CPU)
> - qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag;
> + qbo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag;
> if (!c)
> - qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + qbo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> qbo->placement.num_placement = c;
> qbo->placement.num_busy_placement = c;
> + for (i = 0; i < c; ++i) {
> + qbo->placements[i].fpfn = 0;
> + qbo->placements[i].lpfn = 0;
> + }
> }
>
>
> @@ -259,7 +262,7 @@ int qxl_bo_unpin(struct qxl_bo *bo)
> if (bo->pin_count)
> return 0;
> for (i = 0; i < bo->placement.num_placement; i++)
> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
> r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
> if (unlikely(r != 0))
> dev_err(qdev->dev, "%p validate failed for unpin\n", bo);
> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
> index 71a1bae..f66c59b 100644
> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
> @@ -188,11 +188,13 @@ static void qxl_evict_flags(struct ttm_buffer_object *bo,
> struct ttm_placement *placement)
> {
> struct qxl_bo *qbo;
> - static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + static struct ttm_place placements = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
> + };
>
> if (!qxl_ttm_bo_is_qxl_bo(bo)) {
> - placement->fpfn = 0;
> - placement->lpfn = 0;
> placement->placement = &placements;
> placement->busy_placement = &placements;
> placement->num_placement = 1;
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 542da82..cae3adc 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -468,7 +468,7 @@ struct radeon_bo {
> struct list_head list;
> /* Protected by tbo.reserved */
> u32 initial_domain;
> - u32 placements[3];
> + struct ttm_place placements[3];
> struct ttm_placement placement;
> struct ttm_buffer_object tbo;
> struct ttm_bo_kmap_obj kmap;
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 2875238..0129c7e 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -97,40 +97,56 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
> {
> u32 c = 0, i;
>
> - rbo->placement.fpfn = 0;
> - rbo->placement.lpfn = 0;
> rbo->placement.placement = rbo->placements;
> rbo->placement.busy_placement = rbo->placements;
> if (domain & RADEON_GEM_DOMAIN_VRAM)
> - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
> - TTM_PL_FLAG_VRAM;
> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> + TTM_PL_FLAG_UNCACHED |
> + TTM_PL_FLAG_VRAM;
> +
> if (domain & RADEON_GEM_DOMAIN_GTT) {
> if (rbo->flags & RADEON_GEM_GTT_UC) {
> - rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_TT;
> + rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
> + TTM_PL_FLAG_TT;
> +
> } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
> (rbo->rdev->flags & RADEON_IS_AGP)) {
> - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> + TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_TT;
> } else {
> - rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
> + rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
> + TTM_PL_FLAG_TT;
> }
> }
> +
> if (domain & RADEON_GEM_DOMAIN_CPU) {
> if (rbo->flags & RADEON_GEM_GTT_UC) {
> - rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_SYSTEM;
> + rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
> + TTM_PL_FLAG_SYSTEM;
> +
> } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
> rbo->rdev->flags & RADEON_IS_AGP) {
> - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
> + TTM_PL_FLAG_UNCACHED |
> TTM_PL_FLAG_SYSTEM;
> } else {
> - rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM;
> + rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
> + TTM_PL_FLAG_SYSTEM;
> }
> }
> if (!c)
> - rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
> + rbo->placements[c++].flags = TTM_PL_MASK_CACHING |
> + TTM_PL_FLAG_SYSTEM;
> +
> rbo->placement.num_placement = c;
> rbo->placement.num_busy_placement = c;
>
> + for (i = 0; i < c; ++i) {
> + rbo->placements[i].fpfn = 0;
> + rbo->placements[i].lpfn = 0;
> + }
> +
> /*
> * Use two-ended allocation depending on the buffer size to
> * improve fragmentation quality.
> @@ -138,7 +154,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
> */
> if (rbo->tbo.mem.size > 512 * 1024) {
> for (i = 0; i < c; i++) {
> - rbo->placements[i] |= TTM_PL_FLAG_TOPDOWN;
> + rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
> }
> }
> }
> @@ -287,21 +303,22 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
> return 0;
> }
> radeon_ttm_placement_from_domain(bo, domain);
> - if (domain == RADEON_GEM_DOMAIN_VRAM) {
> + for (i = 0; i < bo->placement.num_placement; i++) {
> + unsigned lpfn = 0;
> +
> /* force to pin into visible video ram */
> - bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> - }
> - if (max_offset) {
> - u64 lpfn = max_offset >> PAGE_SHIFT;
> + if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
> + lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
> + else
> + lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
>
> - if (!bo->placement.lpfn)
> - bo->placement.lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT;
> + if (max_offset)
> + lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
>
> - if (lpfn < bo->placement.lpfn)
> - bo->placement.lpfn = lpfn;
> + bo->placements[i].lpfn = lpfn;
> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
> }
> - for (i = 0; i < bo->placement.num_placement; i++)
> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
> +
> r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
> if (likely(r == 0)) {
> bo->pin_count = 1;
> @@ -333,8 +350,10 @@ int radeon_bo_unpin(struct radeon_bo *bo)
> bo->pin_count--;
> if (bo->pin_count)
> return 0;
> - for (i = 0; i < bo->placement.num_placement; i++)
> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
> + for (i = 0; i < bo->placement.num_placement; i++) {
> + bo->placements[i].lpfn = 0;
> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
> + }
> r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
> if (likely(r == 0)) {
> if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
> @@ -735,7 +754,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
>
> /* hurrah the memory is not visible ! */
> radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
> - rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
> + rbo->placements[0].lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
> r = ttm_bo_validate(bo, &rbo->placement, false, false);
> if (unlikely(r == -ENOMEM)) {
> radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index 12e37b1..822eb36 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -178,12 +178,15 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
> static void radeon_evict_flags(struct ttm_buffer_object *bo,
> struct ttm_placement *placement)
> {
> + static struct ttm_place placements = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
> + };
> +
> struct radeon_bo *rbo;
> - static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>
> if (!radeon_ttm_bo_is_radeon_bo(bo)) {
> - placement->fpfn = 0;
> - placement->lpfn = 0;
> placement->placement = &placements;
> placement->busy_placement = &placements;
> placement->num_placement = 1;
> @@ -286,20 +289,20 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
> struct radeon_device *rdev;
> struct ttm_mem_reg *old_mem = &bo->mem;
> struct ttm_mem_reg tmp_mem;
> - u32 placements;
> + struct ttm_place placements;
> struct ttm_placement placement;
> int r;
>
> rdev = radeon_get_rdev(bo->bdev);
> tmp_mem = *new_mem;
> tmp_mem.mm_node = NULL;
> - placement.fpfn = 0;
> - placement.lpfn = 0;
> placement.num_placement = 1;
> placement.placement = &placements;
> placement.num_busy_placement = 1;
> placement.busy_placement = &placements;
> - placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
> + placements.fpfn = 0;
> + placements.lpfn = 0;
> + placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
> r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
> interruptible, no_wait_gpu);
> if (unlikely(r)) {
> @@ -334,19 +337,19 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
> struct ttm_mem_reg *old_mem = &bo->mem;
> struct ttm_mem_reg tmp_mem;
> struct ttm_placement placement;
> - u32 placements;
> + struct ttm_place placements;
> int r;
>
> rdev = radeon_get_rdev(bo->bdev);
> tmp_mem = *new_mem;
> tmp_mem.mm_node = NULL;
> - placement.fpfn = 0;
> - placement.lpfn = 0;
> placement.num_placement = 1;
> placement.placement = &placements;
> placement.num_busy_placement = 1;
> placement.busy_placement = &placements;
> - placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
> + placements.fpfn = 0;
> + placements.lpfn = 0;
> + placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
> r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
> interruptible, no_wait_gpu);
> if (unlikely(r)) {
> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
> index 6bf55ec..1168de7 100644
> --- a/drivers/gpu/drm/radeon/radeon_uvd.c
> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c
> @@ -233,8 +233,12 @@ int radeon_uvd_resume(struct radeon_device *rdev)
>
> void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo)
> {
> - rbo->placement.fpfn = 0 >> PAGE_SHIFT;
> - rbo->placement.lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
> + int i;
> +
> + for (i = 0; i < rbo->placement.num_placement; ++i) {
> + rbo->placements[i].fpfn = 0 >> PAGE_SHIFT;
> + rbo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
> + }
> }
>
> void radeon_uvd_free_handles(struct radeon_device *rdev, struct drm_file *filp)
> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
> index 3da89d5..b992ec3 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
> @@ -53,12 +53,13 @@ static struct attribute ttm_bo_count = {
> .mode = S_IRUGO
> };
>
> -static inline int ttm_mem_type_from_flags(uint32_t flags, uint32_t *mem_type)
> +static inline int ttm_mem_type_from_place(const struct ttm_place *place,
> + uint32_t *mem_type)
> {
> int i;
>
> for (i = 0; i <= TTM_PL_PRIV5; i++)
> - if (flags & (1 << i)) {
> + if (place->flags & (1 << i)) {
> *mem_type = i;
> return 0;
> }
> @@ -89,12 +90,12 @@ static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo,
> bo, bo->mem.num_pages, bo->mem.size >> 10,
> bo->mem.size >> 20);
> for (i = 0; i < placement->num_placement; i++) {
> - ret = ttm_mem_type_from_flags(placement->placement[i],
> + ret = ttm_mem_type_from_place(&placement->placement[i],
> &mem_type);
> if (ret)
> return;
> pr_err(" placement[%d]=0x%08X (%d)\n",
> - i, placement->placement[i], mem_type);
> + i, placement->placement[i].flags, mem_type);
> ttm_mem_type_debug(bo->bdev, mem_type);
> }
> }
> @@ -685,8 +686,6 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
> evict_mem.bus.io_reserved_vm = false;
> evict_mem.bus.io_reserved_count = 0;
>
> - placement.fpfn = 0;
> - placement.lpfn = 0;
> placement.num_placement = 0;
> placement.num_busy_placement = 0;
> bdev->driver->evict_flags(bo, &placement);
> @@ -774,7 +773,7 @@ EXPORT_SYMBOL(ttm_bo_mem_put);
> */
> static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
> uint32_t mem_type,
> - struct ttm_placement *placement,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem,
> bool interruptible,
> bool no_wait_gpu)
> @@ -784,7 +783,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
> int ret;
>
> do {
> - ret = (*man->func->get_node)(man, bo, placement, 0, mem);
> + ret = (*man->func->get_node)(man, bo, place, mem);
> if (unlikely(ret != 0))
> return ret;
> if (mem->mm_node)
> @@ -827,18 +826,18 @@ static uint32_t ttm_bo_select_caching(struct ttm_mem_type_manager *man,
>
> static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man,
> uint32_t mem_type,
> - uint32_t proposed_placement,
> + const struct ttm_place *place,
> uint32_t *masked_placement)
> {
> uint32_t cur_flags = ttm_bo_type_flags(mem_type);
>
> - if ((cur_flags & proposed_placement & TTM_PL_MASK_MEM) == 0)
> + if ((cur_flags & place->flags & TTM_PL_MASK_MEM) == 0)
> return false;
>
> - if ((proposed_placement & man->available_caching) == 0)
> + if ((place->flags & man->available_caching) == 0)
> return false;
>
> - cur_flags |= (proposed_placement & man->available_caching);
> + cur_flags |= (place->flags & man->available_caching);
>
> *masked_placement = cur_flags;
> return true;
> @@ -869,15 +868,14 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>
> mem->mm_node = NULL;
> for (i = 0; i < placement->num_placement; ++i) {
> - ret = ttm_mem_type_from_flags(placement->placement[i],
> - &mem_type);
> + const struct ttm_place *place = &placement->placement[i];
> +
> + ret = ttm_mem_type_from_place(place, &mem_type);
> if (ret)
> return ret;
> man = &bdev->man[mem_type];
>
> - type_ok = ttm_bo_mt_compatible(man,
> - mem_type,
> - placement->placement[i],
> + type_ok = ttm_bo_mt_compatible(man, mem_type, place,
> &cur_flags);
>
> if (!type_ok)
> @@ -889,7 +887,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> * Use the access and other non-mapping-related flag bits from
> * the memory placement flags to the current flags
> */
> - ttm_flag_masked(&cur_flags, placement->placement[i],
> + ttm_flag_masked(&cur_flags, place->flags,
> ~TTM_PL_MASK_MEMTYPE);
>
> if (mem_type == TTM_PL_SYSTEM)
> @@ -897,8 +895,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>
> if (man->has_type && man->use_type) {
> type_found = true;
> - ret = (*man->func->get_node)(man, bo, placement,
> - cur_flags, mem);
> + ret = (*man->func->get_node)(man, bo, place, mem);
> if (unlikely(ret))
> return ret;
> }
> @@ -916,17 +913,15 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> return -EINVAL;
>
> for (i = 0; i < placement->num_busy_placement; ++i) {
> - ret = ttm_mem_type_from_flags(placement->busy_placement[i],
> - &mem_type);
> + const struct ttm_place *place = &placement->busy_placement[i];
> +
> + ret = ttm_mem_type_from_place(place, &mem_type);
> if (ret)
> return ret;
> man = &bdev->man[mem_type];
> if (!man->has_type)
> continue;
> - if (!ttm_bo_mt_compatible(man,
> - mem_type,
> - placement->busy_placement[i],
> - &cur_flags))
> + if (!ttm_bo_mt_compatible(man, mem_type, place, &cur_flags))
> continue;
>
> cur_flags = ttm_bo_select_caching(man, bo->mem.placement,
> @@ -935,7 +930,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> * Use the access and other non-mapping-related flag bits from
> * the memory placement flags to the current flags
> */
> - ttm_flag_masked(&cur_flags, placement->busy_placement[i],
> + ttm_flag_masked(&cur_flags, place->flags,
> ~TTM_PL_MASK_MEMTYPE);
>
> if (mem_type == TTM_PL_SYSTEM) {
> @@ -945,7 +940,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
> return 0;
> }
>
> - ret = ttm_bo_mem_force_space(bo, mem_type, placement, mem,
> + ret = ttm_bo_mem_force_space(bo, mem_type, place, mem,
> interruptible, no_wait_gpu);
> if (ret == 0 && mem->mm_node) {
> mem->placement = cur_flags;
> @@ -1006,20 +1001,27 @@ static bool ttm_bo_mem_compat(struct ttm_placement *placement,
> {
> int i;
>
> - if (mem->mm_node && placement->lpfn != 0 &&
> - (mem->start < placement->fpfn ||
> - mem->start + mem->num_pages > placement->lpfn))
> - return false;
> -
> for (i = 0; i < placement->num_placement; i++) {
> - *new_flags = placement->placement[i];
> + const struct ttm_place *heap = &placement->placement[i];
> + if (mem->mm_node && heap->lpfn != 0 &&
> + (mem->start < heap->fpfn ||
> + mem->start + mem->num_pages > heap->lpfn))
> + continue;
> +
> + *new_flags = heap->flags;
> if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
> (*new_flags & mem->placement & TTM_PL_MASK_MEM))
> return true;
> }
>
> for (i = 0; i < placement->num_busy_placement; i++) {
> - *new_flags = placement->busy_placement[i];
> + const struct ttm_place *heap = &placement->busy_placement[i];
> + if (mem->mm_node && heap->lpfn != 0 &&
> + (mem->start < heap->fpfn ||
> + mem->start + mem->num_pages > heap->lpfn))
> + continue;
> +
> + *new_flags = heap->flags;
> if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
> (*new_flags & mem->placement & TTM_PL_MASK_MEM))
> return true;
> @@ -1037,11 +1039,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
> uint32_t new_flags;
>
> lockdep_assert_held(&bo->resv->lock.base);
> - /* Check that range is valid */
> - if (placement->lpfn || placement->fpfn)
> - if (placement->fpfn > placement->lpfn ||
> - (placement->lpfn - placement->fpfn) < bo->num_pages)
> - return -EINVAL;
> /*
> * Check whether we need to move buffer.
> */
> @@ -1070,15 +1067,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
> }
> EXPORT_SYMBOL(ttm_bo_validate);
>
> -int ttm_bo_check_placement(struct ttm_buffer_object *bo,
> - struct ttm_placement *placement)
> -{
> - BUG_ON((placement->fpfn || placement->lpfn) &&
> - (bo->mem.num_pages > (placement->lpfn - placement->fpfn)));
> -
> - return 0;
> -}
> -
> int ttm_bo_init(struct ttm_bo_device *bdev,
> struct ttm_buffer_object *bo,
> unsigned long size,
> @@ -1147,15 +1135,12 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
> atomic_inc(&bo->glob->bo_count);
> drm_vma_node_reset(&bo->vma_node);
>
> - ret = ttm_bo_check_placement(bo, placement);
> -
> /*
> * For ttm_bo_type_device buffers, allocate
> * address space from the device.
> */
> - if (likely(!ret) &&
> - (bo->type == ttm_bo_type_device ||
> - bo->type == ttm_bo_type_sg))
> + if (bo->type == ttm_bo_type_device ||
> + bo->type == ttm_bo_type_sg)
> ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node,
> bo->mem.num_pages);
>
> diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c
> index 9e103a48..964387f 100644
> --- a/drivers/gpu/drm/ttm/ttm_bo_manager.c
> +++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c
> @@ -49,8 +49,7 @@ struct ttm_range_manager {
>
> static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
> struct ttm_buffer_object *bo,
> - struct ttm_placement *placement,
> - uint32_t flags,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem)
> {
> struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
> @@ -60,7 +59,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
> unsigned long lpfn;
> int ret;
>
> - lpfn = placement->lpfn;
> + lpfn = place->lpfn;
> if (!lpfn)
> lpfn = man->size;
>
> @@ -68,13 +67,13 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
> if (!node)
> return -ENOMEM;
>
> - if (flags & TTM_PL_FLAG_TOPDOWN)
> + if (place->flags & TTM_PL_FLAG_TOPDOWN)
> aflags = DRM_MM_CREATE_TOP;
>
> spin_lock(&rman->lock);
> ret = drm_mm_insert_node_in_range_generic(mm, node, mem->num_pages,
> mem->page_alignment, 0,
> - placement->fpfn, lpfn,
> + place->fpfn, lpfn,
> DRM_MM_SEARCH_BEST,
> aflags);
> spin_unlock(&rman->lock);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
> index 6327cfc..37c093c 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
> @@ -30,66 +30,101 @@
> #include <drm/ttm/ttm_placement.h>
> #include <drm/ttm/ttm_page_alloc.h>
>
> -static uint32_t vram_placement_flags = TTM_PL_FLAG_VRAM |
> - TTM_PL_FLAG_CACHED;
> -
> -static uint32_t vram_ne_placement_flags = TTM_PL_FLAG_VRAM |
> - TTM_PL_FLAG_CACHED |
> - TTM_PL_FLAG_NO_EVICT;
> +static struct ttm_place vram_placement_flags = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
> +};
>
> -static uint32_t sys_placement_flags = TTM_PL_FLAG_SYSTEM |
> - TTM_PL_FLAG_CACHED;
> +static struct ttm_place vram_ne_placement_flags = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
> +};
>
> -static uint32_t sys_ne_placement_flags = TTM_PL_FLAG_SYSTEM |
> - TTM_PL_FLAG_CACHED |
> - TTM_PL_FLAG_NO_EVICT;
> +static struct ttm_place sys_placement_flags = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
> +};
>
> -static uint32_t gmr_placement_flags = VMW_PL_FLAG_GMR |
> - TTM_PL_FLAG_CACHED;
> +static struct ttm_place sys_ne_placement_flags = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
> +};
>
> -static uint32_t gmr_ne_placement_flags = VMW_PL_FLAG_GMR |
> - TTM_PL_FLAG_CACHED |
> - TTM_PL_FLAG_NO_EVICT;
> +static struct ttm_place gmr_placement_flags = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
> +};
>
> -static uint32_t mob_placement_flags = VMW_PL_FLAG_MOB |
> - TTM_PL_FLAG_CACHED;
> +static struct ttm_place gmr_ne_placement_flags = {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
> +};
>
> -struct ttm_placement vmw_vram_placement = {
> +static struct ttm_place mob_placement_flags = {
> .fpfn = 0,
> .lpfn = 0,
> + .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
> +};
> +
> +struct ttm_placement vmw_vram_placement = {
> .num_placement = 1,
> .placement = &vram_placement_flags,
> .num_busy_placement = 1,
> .busy_placement = &vram_placement_flags
> };
>
> -static uint32_t vram_gmr_placement_flags[] = {
> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
> +static struct ttm_place vram_gmr_placement_flags[] = {
> + {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
> + }, {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
> + }
> };
>
> -static uint32_t gmr_vram_placement_flags[] = {
> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED,
> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
> +static struct ttm_place gmr_vram_placement_flags[] = {
> + {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
> + }, {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
> + }
> };
>
> struct ttm_placement vmw_vram_gmr_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 2,
> .placement = vram_gmr_placement_flags,
> .num_busy_placement = 1,
> .busy_placement = &gmr_placement_flags
> };
>
> -static uint32_t vram_gmr_ne_placement_flags[] = {
> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT,
> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
> +static struct ttm_place vram_gmr_ne_placement_flags[] = {
> + {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED |
> + TTM_PL_FLAG_NO_EVICT
> + }, {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED |
> + TTM_PL_FLAG_NO_EVICT
> + }
> };
>
> struct ttm_placement vmw_vram_gmr_ne_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 2,
> .placement = vram_gmr_ne_placement_flags,
> .num_busy_placement = 1,
> @@ -97,8 +132,6 @@ struct ttm_placement vmw_vram_gmr_ne_placement = {
> };
>
> struct ttm_placement vmw_vram_sys_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 1,
> .placement = &vram_placement_flags,
> .num_busy_placement = 1,
> @@ -106,8 +139,6 @@ struct ttm_placement vmw_vram_sys_placement = {
> };
>
> struct ttm_placement vmw_vram_ne_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 1,
> .placement = &vram_ne_placement_flags,
> .num_busy_placement = 1,
> @@ -115,8 +146,6 @@ struct ttm_placement vmw_vram_ne_placement = {
> };
>
> struct ttm_placement vmw_sys_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 1,
> .placement = &sys_placement_flags,
> .num_busy_placement = 1,
> @@ -124,24 +153,33 @@ struct ttm_placement vmw_sys_placement = {
> };
>
> struct ttm_placement vmw_sys_ne_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 1,
> .placement = &sys_ne_placement_flags,
> .num_busy_placement = 1,
> .busy_placement = &sys_ne_placement_flags
> };
>
> -static uint32_t evictable_placement_flags[] = {
> - TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED,
> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED,
> - VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
> +static struct ttm_place evictable_placement_flags[] = {
> + {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
> + }, {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
> + }, {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
> + }, {
> + .fpfn = 0,
> + .lpfn = 0,
> + .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
> + }
> };
>
> struct ttm_placement vmw_evictable_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 4,
> .placement = evictable_placement_flags,
> .num_busy_placement = 1,
> @@ -149,8 +187,6 @@ struct ttm_placement vmw_evictable_placement = {
> };
>
> struct ttm_placement vmw_srf_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 1,
> .num_busy_placement = 2,
> .placement = &gmr_placement_flags,
> @@ -158,8 +194,6 @@ struct ttm_placement vmw_srf_placement = {
> };
>
> struct ttm_placement vmw_mob_placement = {
> - .fpfn = 0,
> - .lpfn = 0,
> .num_placement = 1,
> .num_busy_placement = 1,
> .placement = &mob_placement_flags,
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
> index ed1d510..914b375 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
> @@ -198,13 +198,19 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *dev_priv,
> {
> struct ttm_buffer_object *bo = &buf->base;
> struct ttm_placement placement;
> + struct ttm_place place;
> int ret = 0;
>
> if (pin)
> - placement = vmw_vram_ne_placement;
> + place = vmw_vram_ne_placement.placement[0];
> else
> - placement = vmw_vram_placement;
> - placement.lpfn = bo->num_pages;
> + place = vmw_vram_placement.placement[0];
> + place.lpfn = bo->num_pages;
> +
> + placement.num_placement = 1;
> + placement.placement = &place;
> + placement.num_busy_placement = 1;
> + placement.busy_placement = &place;
>
> ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
> if (unlikely(ret != 0))
> @@ -293,21 +299,23 @@ void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *bo,
> */
> void vmw_bo_pin(struct ttm_buffer_object *bo, bool pin)
> {
> - uint32_t pl_flags;
> + struct ttm_place pl;
> struct ttm_placement placement;
> uint32_t old_mem_type = bo->mem.mem_type;
> int ret;
>
> lockdep_assert_held(&bo->resv->lock.base);
>
> - pl_flags = TTM_PL_FLAG_VRAM | VMW_PL_FLAG_GMR | VMW_PL_FLAG_MOB
> + pl.fpfn = 0;
> + pl.lpfn = 0;
> + pl.flags = TTM_PL_FLAG_VRAM | VMW_PL_FLAG_GMR | VMW_PL_FLAG_MOB
> | TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED;
> if (pin)
> - pl_flags |= TTM_PL_FLAG_NO_EVICT;
> + pl.flags |= TTM_PL_FLAG_NO_EVICT;
>
> memset(&placement, 0, sizeof(placement));
> placement.num_placement = 1;
> - placement.placement = &pl_flags;
> + placement.placement = &pl;
>
> ret = ttm_bo_validate(bo, &placement, false, true);
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
> index b031b48..0a474f3 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
> @@ -374,10 +374,16 @@ static int vmw_fb_create_bo(struct vmw_private *vmw_priv,
> size_t size, struct vmw_dma_buffer **out)
> {
> struct vmw_dma_buffer *vmw_bo;
> - struct ttm_placement ne_placement = vmw_vram_ne_placement;
> + struct ttm_place ne_place = vmw_vram_ne_placement.placement[0];
> + struct ttm_placement ne_placement;
> int ret;
>
> - ne_placement.lpfn = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
> + ne_placement.num_placement = 1;
> + ne_placement.placement = &ne_place;
> + ne_placement.num_busy_placement = 1;
> + ne_placement.busy_placement = &ne_place;
> +
> + ne_place.lpfn = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
>
> (void) ttm_write_lock(&vmw_priv->reservation_sem, false);
>
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
> index 26f8bdd..170b61b 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
> @@ -46,8 +46,7 @@ struct vmwgfx_gmrid_man {
>
> static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
> struct ttm_buffer_object *bo,
> - struct ttm_placement *placement,
> - uint32_t flags,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem)
> {
> struct vmwgfx_gmrid_man *gman =
> diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
> index 7526c5b..e3d39c8 100644
> --- a/include/drm/ttm/ttm_bo_api.h
> +++ b/include/drm/ttm/ttm_bo_api.h
> @@ -45,12 +45,24 @@ struct ttm_bo_device;
>
> struct drm_mm_node;
>
> +/**
> + * struct ttm_place
> + *
> + * @fpfn: first valid page frame number to put the object
> + * @lpfn: last valid page frame number to put the object
> + * @flags: memory domain and caching flags for the object
> + *
> + * Structure indicating a possible place to put an object.
> + */
> +struct ttm_place {
> + unsigned fpfn;
> + unsigned lpfn;
> + uint32_t flags;
> +};
>
> /**
> * struct ttm_placement
> *
> - * @fpfn: first valid page frame number to put the object
> - * @lpfn: last valid page frame number to put the object
> * @num_placement: number of preferred placements
> * @placement: preferred placements
> * @num_busy_placement: number of preferred placements when need to evict buffer
> @@ -59,12 +71,10 @@ struct drm_mm_node;
> * Structure indicating the placement you request for an object.
> */
> struct ttm_placement {
> - unsigned fpfn;
> - unsigned lpfn;
> - unsigned num_placement;
> - const uint32_t *placement;
> - unsigned num_busy_placement;
> - const uint32_t *busy_placement;
> + unsigned num_placement;
> + const struct ttm_place *placement;
> + unsigned num_busy_placement;
> + const struct ttm_place *busy_placement;
> };
>
> /**
> @@ -519,20 +529,6 @@ extern int ttm_bo_create(struct ttm_bo_device *bdev,
> struct ttm_buffer_object **p_bo);
>
> /**
> - * ttm_bo_check_placement
> - *
> - * @bo: the buffer object.
> - * @placement: placements
> - *
> - * Performs minimal validity checking on an intended change of
> - * placement flags.
> - * Returns
> - * -EINVAL: Intended change is invalid or not allowed.
> - */
> -extern int ttm_bo_check_placement(struct ttm_buffer_object *bo,
> - struct ttm_placement *placement);
> -
> -/**
> * ttm_bo_init_mm
> *
> * @bdev: Pointer to a ttm_bo_device struct.
> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
> index 202f0a7..426bf84 100644
> --- a/include/drm/ttm/ttm_bo_driver.h
> +++ b/include/drm/ttm/ttm_bo_driver.h
> @@ -206,8 +206,7 @@ struct ttm_mem_type_manager_func {
> */
> int (*get_node)(struct ttm_mem_type_manager *man,
> struct ttm_buffer_object *bo,
> - struct ttm_placement *placement,
> - uint32_t flags,
> + const struct ttm_place *place,
> struct ttm_mem_reg *mem);
>
> /**
> --
> 1.9.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
2014-08-25 15:51 ` [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Alex Deucher
@ 2014-08-26 11:28 ` Christian König
2014-08-27 4:21 ` Dave Airlie
0 siblings, 1 reply; 7+ messages in thread
From: Christian König @ 2014-08-26 11:28 UTC (permalink / raw)
To: Alex Deucher; +Cc: Maling list - DRI developers
Hi Dave,
any preferences how I can push this change upstream?
Since it affects a whole bunch of drivers it would be nice if I could
get more reviews and/or acks on it. And if we just push it to you
through the Radeon tree it will probably cause a bunch of merge conflicts.
Thanks for any advice,
Christian.
Am 25.08.2014 um 17:51 schrieb Alex Deucher:
> On Fri, Aug 22, 2014 at 4:13 AM, Christian König
> <deathsimple@vodafone.de> wrote:
>> From: Christian König <christian.koenig@amd.com>
>>
>> This allows us to more fine grained specify where to place the buffer object.
>>
>> Signed-off-by: Christian König <christian.koenig@amd.com>
> Series is:
>
> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
>
>> ---
>> drivers/gpu/drm/ast/ast_drv.h | 2 +-
>> drivers/gpu/drm/ast/ast_ttm.c | 20 ++--
>> drivers/gpu/drm/cirrus/cirrus_drv.h | 2 +-
>> drivers/gpu/drm/cirrus/cirrus_ttm.c | 17 ++--
>> drivers/gpu/drm/mgag200/mgag200_drv.h | 2 +-
>> drivers/gpu/drm/mgag200/mgag200_ttm.c | 20 ++--
>> drivers/gpu/drm/nouveau/nouveau_bo.c | 52 +++++++---
>> drivers/gpu/drm/nouveau/nouveau_bo.h | 4 +-
>> drivers/gpu/drm/nouveau/nouveau_ttm.c | 9 +-
>> drivers/gpu/drm/qxl/qxl_drv.h | 2 +-
>> drivers/gpu/drm/qxl/qxl_object.c | 17 ++--
>> drivers/gpu/drm/qxl/qxl_ttm.c | 8 +-
>> drivers/gpu/drm/radeon/radeon.h | 2 +-
>> drivers/gpu/drm/radeon/radeon_object.c | 71 +++++++++-----
>> drivers/gpu/drm/radeon/radeon_ttm.c | 25 ++---
>> drivers/gpu/drm/radeon/radeon_uvd.c | 8 +-
>> drivers/gpu/drm/ttm/ttm_bo.c | 93 ++++++++----------
>> drivers/gpu/drm/ttm/ttm_bo_manager.c | 9 +-
>> drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 136 ++++++++++++++++----------
>> drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c | 22 +++--
>> drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 10 +-
>> drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 3 +-
>> include/drm/ttm/ttm_bo_api.h | 40 ++++----
>> include/drm/ttm/ttm_bo_driver.h | 3 +-
>> 24 files changed, 332 insertions(+), 245 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
>> index 957d4fa..cb91c2a 100644
>> --- a/drivers/gpu/drm/ast/ast_drv.h
>> +++ b/drivers/gpu/drm/ast/ast_drv.h
>> @@ -316,7 +316,7 @@ struct ast_bo {
>> struct ttm_placement placement;
>> struct ttm_bo_kmap_obj kmap;
>> struct drm_gem_object gem;
>> - u32 placements[3];
>> + struct ttm_place placements[3];
>> int pin_count;
>> };
>> #define gem_to_ast_bo(gobj) container_of((gobj), struct ast_bo, gem)
>> diff --git a/drivers/gpu/drm/ast/ast_ttm.c b/drivers/gpu/drm/ast/ast_ttm.c
>> index b824622..8008ea0 100644
>> --- a/drivers/gpu/drm/ast/ast_ttm.c
>> +++ b/drivers/gpu/drm/ast/ast_ttm.c
>> @@ -293,18 +293,22 @@ void ast_mm_fini(struct ast_private *ast)
>> void ast_ttm_placement(struct ast_bo *bo, int domain)
>> {
>> u32 c = 0;
>> - bo->placement.fpfn = 0;
>> - bo->placement.lpfn = 0;
>> + unsigned i;
>> +
>> bo->placement.placement = bo->placements;
>> bo->placement.busy_placement = bo->placements;
>> if (domain & TTM_PL_FLAG_VRAM)
>> - bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
>> + bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
>> if (domain & TTM_PL_FLAG_SYSTEM)
>> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> if (!c)
>> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> bo->placement.num_placement = c;
>> bo->placement.num_busy_placement = c;
>> + for (i = 0; i < c; ++i) {
>> + bo->placements[i].fpfn = 0;
>> + bo->placements[i].lpfn = 0;
>> + }
>> }
>>
>> int ast_bo_create(struct drm_device *dev, int size, int align,
>> @@ -360,7 +364,7 @@ int ast_bo_pin(struct ast_bo *bo, u32 pl_flag, u64 *gpu_addr)
>>
>> ast_ttm_placement(bo, pl_flag);
>> for (i = 0; i < bo->placement.num_placement; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret)
>> return ret;
>> @@ -383,7 +387,7 @@ int ast_bo_unpin(struct ast_bo *bo)
>> return 0;
>>
>> for (i = 0; i < bo->placement.num_placement ; i++)
>> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret)
>> return ret;
>> @@ -407,7 +411,7 @@ int ast_bo_push_sysram(struct ast_bo *bo)
>>
>> ast_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
>> for (i = 0; i < bo->placement.num_placement ; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>>
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret) {
>> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
>> index 401c890..dd2cfc9 100644
>> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
>> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
>> @@ -163,7 +163,7 @@ struct cirrus_bo {
>> struct ttm_placement placement;
>> struct ttm_bo_kmap_obj kmap;
>> struct drm_gem_object gem;
>> - u32 placements[3];
>> + struct ttm_place placements[3];
>> int pin_count;
>> };
>> #define gem_to_cirrus_bo(gobj) container_of((gobj), struct cirrus_bo, gem)
>> diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c
>> index 92e6b77..3e7d758 100644
>> --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c
>> +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c
>> @@ -298,18 +298,21 @@ void cirrus_mm_fini(struct cirrus_device *cirrus)
>> void cirrus_ttm_placement(struct cirrus_bo *bo, int domain)
>> {
>> u32 c = 0;
>> - bo->placement.fpfn = 0;
>> - bo->placement.lpfn = 0;
>> + unsigned i;
>> bo->placement.placement = bo->placements;
>> bo->placement.busy_placement = bo->placements;
>> if (domain & TTM_PL_FLAG_VRAM)
>> - bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
>> + bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
>> if (domain & TTM_PL_FLAG_SYSTEM)
>> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> if (!c)
>> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> bo->placement.num_placement = c;
>> bo->placement.num_busy_placement = c;
>> + for (i = 0; i < c; ++i) {
>> + bo->placements[i].fpfn = 0;
>> + bo->placements[i].lpfn = 0;
>> + }
>> }
>>
>> int cirrus_bo_create(struct drm_device *dev, int size, int align,
>> @@ -365,7 +368,7 @@ int cirrus_bo_pin(struct cirrus_bo *bo, u32 pl_flag, u64 *gpu_addr)
>>
>> cirrus_ttm_placement(bo, pl_flag);
>> for (i = 0; i < bo->placement.num_placement; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret)
>> return ret;
>> @@ -392,7 +395,7 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
>>
>> cirrus_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
>> for (i = 0; i < bo->placement.num_placement ; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>>
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret) {
>> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
>> index 80de23d..2e2b76a 100644
>> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
>> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
>> @@ -224,7 +224,7 @@ struct mgag200_bo {
>> struct ttm_placement placement;
>> struct ttm_bo_kmap_obj kmap;
>> struct drm_gem_object gem;
>> - u32 placements[3];
>> + struct ttm_place placements[3];
>> int pin_count;
>> };
>> #define gem_to_mga_bo(gobj) container_of((gobj), struct mgag200_bo, gem)
>> diff --git a/drivers/gpu/drm/mgag200/mgag200_ttm.c b/drivers/gpu/drm/mgag200/mgag200_ttm.c
>> index 5a00e90..be883ef 100644
>> --- a/drivers/gpu/drm/mgag200/mgag200_ttm.c
>> +++ b/drivers/gpu/drm/mgag200/mgag200_ttm.c
>> @@ -293,18 +293,22 @@ void mgag200_mm_fini(struct mga_device *mdev)
>> void mgag200_ttm_placement(struct mgag200_bo *bo, int domain)
>> {
>> u32 c = 0;
>> - bo->placement.fpfn = 0;
>> - bo->placement.lpfn = 0;
>> + unsigned i;
>> +
>> bo->placement.placement = bo->placements;
>> bo->placement.busy_placement = bo->placements;
>> if (domain & TTM_PL_FLAG_VRAM)
>> - bo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
>> + bo->placements[c++].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM;
>> if (domain & TTM_PL_FLAG_SYSTEM)
>> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> if (!c)
>> - bo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + bo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> bo->placement.num_placement = c;
>> bo->placement.num_busy_placement = c;
>> + for (i = 0; i < c; ++i) {
>> + bo->placements[i].fpfn = 0;
>> + bo->placements[i].lpfn = 0;
>> + }
>> }
>>
>> int mgag200_bo_create(struct drm_device *dev, int size, int align,
>> @@ -361,7 +365,7 @@ int mgag200_bo_pin(struct mgag200_bo *bo, u32 pl_flag, u64 *gpu_addr)
>>
>> mgag200_ttm_placement(bo, pl_flag);
>> for (i = 0; i < bo->placement.num_placement; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret)
>> return ret;
>> @@ -384,7 +388,7 @@ int mgag200_bo_unpin(struct mgag200_bo *bo)
>> return 0;
>>
>> for (i = 0; i < bo->placement.num_placement ; i++)
>> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret)
>> return ret;
>> @@ -408,7 +412,7 @@ int mgag200_bo_push_sysram(struct mgag200_bo *bo)
>>
>> mgag200_ttm_placement(bo, TTM_PL_FLAG_SYSTEM);
>> for (i = 0; i < bo->placement.num_placement ; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>>
>> ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>> if (ret) {
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c
>> index ba29a70..7dcd689 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_bo.c
>> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
>> @@ -245,16 +245,16 @@ nouveau_bo_new(struct drm_device *dev, int size, int align,
>> }
>>
>> static void
>> -set_placement_list(uint32_t *pl, unsigned *n, uint32_t type, uint32_t flags)
>> +set_placement_list(struct ttm_place *pl, unsigned *n, uint32_t type, uint32_t flags)
>> {
>> *n = 0;
>>
>> if (type & TTM_PL_FLAG_VRAM)
>> - pl[(*n)++] = TTM_PL_FLAG_VRAM | flags;
>> + pl[(*n)++].flags = TTM_PL_FLAG_VRAM | flags;
>> if (type & TTM_PL_FLAG_TT)
>> - pl[(*n)++] = TTM_PL_FLAG_TT | flags;
>> + pl[(*n)++].flags = TTM_PL_FLAG_TT | flags;
>> if (type & TTM_PL_FLAG_SYSTEM)
>> - pl[(*n)++] = TTM_PL_FLAG_SYSTEM | flags;
>> + pl[(*n)++].flags = TTM_PL_FLAG_SYSTEM | flags;
>> }
>>
>> static void
>> @@ -263,6 +263,7 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
>> struct nouveau_drm *drm = nouveau_bdev(nvbo->bo.bdev);
>> struct nouveau_fb *pfb = nouveau_fb(drm->device);
>> u32 vram_pages = pfb->ram->size >> PAGE_SHIFT;
>> + unsigned i, fpfn, lpfn;
>>
>> if ((nv_device(drm->device)->card_type == NV_10 ||
>> nv_device(drm->device)->card_type == NV_11) &&
>> @@ -275,11 +276,19 @@ set_placement_range(struct nouveau_bo *nvbo, uint32_t type)
>> * at the same time.
>> */
>> if (nvbo->tile_flags & NOUVEAU_GEM_TILE_ZETA) {
>> - nvbo->placement.fpfn = vram_pages / 2;
>> - nvbo->placement.lpfn = ~0;
>> + fpfn = vram_pages / 2;
>> + lpfn = ~0;
>> } else {
>> - nvbo->placement.fpfn = 0;
>> - nvbo->placement.lpfn = vram_pages / 2;
>> + fpfn = 0;
>> + lpfn = vram_pages / 2;
>> + }
>> + for (i = 0; i < nvbo->placement.num_placement; ++i) {
>> + nvbo->placements[i].fpfn = fpfn;
>> + nvbo->placements[i].lpfn = lpfn;
>> + }
>> + for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
>> + nvbo->busy_placements[i].fpfn = fpfn;
>> + nvbo->busy_placements[i].lpfn = lpfn;
>> }
>> }
>> }
>> @@ -1040,12 +1049,15 @@ static int
>> nouveau_bo_move_flipd(struct ttm_buffer_object *bo, bool evict, bool intr,
>> bool no_wait_gpu, struct ttm_mem_reg *new_mem)
>> {
>> - u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
>> + struct ttm_place placement_memtype = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
>> + };
>> struct ttm_placement placement;
>> struct ttm_mem_reg tmp_mem;
>> int ret;
>>
>> - placement.fpfn = placement.lpfn = 0;
>> placement.num_placement = placement.num_busy_placement = 1;
>> placement.placement = placement.busy_placement = &placement_memtype;
>>
>> @@ -1073,12 +1085,15 @@ static int
>> nouveau_bo_move_flips(struct ttm_buffer_object *bo, bool evict, bool intr,
>> bool no_wait_gpu, struct ttm_mem_reg *new_mem)
>> {
>> - u32 placement_memtype = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
>> + struct ttm_place placement_memtype = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING
>> + };
>> struct ttm_placement placement;
>> struct ttm_mem_reg tmp_mem;
>> int ret;
>>
>> - placement.fpfn = placement.lpfn = 0;
>> placement.num_placement = placement.num_busy_placement = 1;
>> placement.placement = placement.busy_placement = &placement_memtype;
>>
>> @@ -1294,7 +1309,7 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
>> struct nouveau_bo *nvbo = nouveau_bo(bo);
>> struct nouveau_device *device = nv_device(drm->device);
>> u32 mappable = nv_device_resource_len(device, 1) >> PAGE_SHIFT;
>> - int ret;
>> + int i, ret;
>>
>> /* as long as the bo isn't in vram, and isn't tiled, we've got
>> * nothing to do here.
>> @@ -1319,9 +1334,16 @@ nouveau_ttm_fault_reserve_notify(struct ttm_buffer_object *bo)
>> bo->mem.start + bo->mem.num_pages < mappable)
>> return 0;
>>
>> + for (i = 0; i < nvbo->placement.num_placement; ++i) {
>> + nvbo->placements[i].fpfn = 0;
>> + nvbo->placements[i].lpfn = mappable;
>> + }
>> +
>> + for (i = 0; i < nvbo->placement.num_busy_placement; ++i) {
>> + nvbo->busy_placements[i].fpfn = 0;
>> + nvbo->busy_placements[i].lpfn = mappable;
>> + }
>>
>> - nvbo->placement.fpfn = 0;
>> - nvbo->placement.lpfn = mappable;
>> nouveau_bo_placement_set(nvbo, TTM_PL_FLAG_VRAM, 0);
>> return nouveau_bo_validate(nvbo, false, false);
>> }
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.h b/drivers/gpu/drm/nouveau/nouveau_bo.h
>> index ff17c1f..4ef88e8 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_bo.h
>> +++ b/drivers/gpu/drm/nouveau/nouveau_bo.h
>> @@ -9,8 +9,8 @@ struct nouveau_bo {
>> struct ttm_buffer_object bo;
>> struct ttm_placement placement;
>> u32 valid_domains;
>> - u32 placements[3];
>> - u32 busy_placements[3];
>> + struct ttm_place placements[3];
>> + struct ttm_place busy_placements[3];
>> struct ttm_bo_kmap_obj kmap;
>> struct list_head head;
>>
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_ttm.c b/drivers/gpu/drm/nouveau/nouveau_ttm.c
>> index 7e185c1..e714f7b 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_ttm.c
>> +++ b/drivers/gpu/drm/nouveau/nouveau_ttm.c
>> @@ -75,8 +75,7 @@ nouveau_vram_manager_del(struct ttm_mem_type_manager *man,
>> static int
>> nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
>> struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement,
>> - uint32_t flags,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem)
>> {
>> struct nouveau_drm *drm = nouveau_bdev(man->bdev);
>> @@ -162,8 +161,7 @@ nouveau_gart_manager_del(struct ttm_mem_type_manager *man,
>> static int
>> nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
>> struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement,
>> - uint32_t flags,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem)
>> {
>> struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
>> @@ -243,8 +241,7 @@ nv04_gart_manager_del(struct ttm_mem_type_manager *man, struct ttm_mem_reg *mem)
>> static int
>> nv04_gart_manager_new(struct ttm_mem_type_manager *man,
>> struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement,
>> - uint32_t flags,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem)
>> {
>> struct nouveau_mem *node;
>> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
>> index 36ed40b..f6022b7 100644
>> --- a/drivers/gpu/drm/qxl/qxl_drv.h
>> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
>> @@ -106,7 +106,7 @@ struct qxl_bo {
>> /* Protected by gem.mutex */
>> struct list_head list;
>> /* Protected by tbo.reserved */
>> - u32 placements[3];
>> + struct ttm_place placements[3];
>> struct ttm_placement placement;
>> struct ttm_buffer_object tbo;
>> struct ttm_bo_kmap_obj kmap;
>> diff --git a/drivers/gpu/drm/qxl/qxl_object.c b/drivers/gpu/drm/qxl/qxl_object.c
>> index b95f144..adad12d 100644
>> --- a/drivers/gpu/drm/qxl/qxl_object.c
>> +++ b/drivers/gpu/drm/qxl/qxl_object.c
>> @@ -55,21 +55,24 @@ void qxl_ttm_placement_from_domain(struct qxl_bo *qbo, u32 domain, bool pinned)
>> {
>> u32 c = 0;
>> u32 pflag = pinned ? TTM_PL_FLAG_NO_EVICT : 0;
>> + unsigned i;
>>
>> - qbo->placement.fpfn = 0;
>> - qbo->placement.lpfn = 0;
>> qbo->placement.placement = qbo->placements;
>> qbo->placement.busy_placement = qbo->placements;
>> if (domain == QXL_GEM_DOMAIN_VRAM)
>> - qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag;
>> + qbo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_VRAM | pflag;
>> if (domain == QXL_GEM_DOMAIN_SURFACE)
>> - qbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag;
>> + qbo->placements[c++].flags = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_PRIV0 | pflag;
>> if (domain == QXL_GEM_DOMAIN_CPU)
>> - qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag;
>> + qbo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM | pflag;
>> if (!c)
>> - qbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + qbo->placements[c++].flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> qbo->placement.num_placement = c;
>> qbo->placement.num_busy_placement = c;
>> + for (i = 0; i < c; ++i) {
>> + qbo->placements[i].fpfn = 0;
>> + qbo->placements[i].lpfn = 0;
>> + }
>> }
>>
>>
>> @@ -259,7 +262,7 @@ int qxl_bo_unpin(struct qxl_bo *bo)
>> if (bo->pin_count)
>> return 0;
>> for (i = 0; i < bo->placement.num_placement; i++)
>> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
>> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
>> r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
>> if (unlikely(r != 0))
>> dev_err(qdev->dev, "%p validate failed for unpin\n", bo);
>> diff --git a/drivers/gpu/drm/qxl/qxl_ttm.c b/drivers/gpu/drm/qxl/qxl_ttm.c
>> index 71a1bae..f66c59b 100644
>> --- a/drivers/gpu/drm/qxl/qxl_ttm.c
>> +++ b/drivers/gpu/drm/qxl/qxl_ttm.c
>> @@ -188,11 +188,13 @@ static void qxl_evict_flags(struct ttm_buffer_object *bo,
>> struct ttm_placement *placement)
>> {
>> struct qxl_bo *qbo;
>> - static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + static struct ttm_place placements = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
>> + };
>>
>> if (!qxl_ttm_bo_is_qxl_bo(bo)) {
>> - placement->fpfn = 0;
>> - placement->lpfn = 0;
>> placement->placement = &placements;
>> placement->busy_placement = &placements;
>> placement->num_placement = 1;
>> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
>> index 542da82..cae3adc 100644
>> --- a/drivers/gpu/drm/radeon/radeon.h
>> +++ b/drivers/gpu/drm/radeon/radeon.h
>> @@ -468,7 +468,7 @@ struct radeon_bo {
>> struct list_head list;
>> /* Protected by tbo.reserved */
>> u32 initial_domain;
>> - u32 placements[3];
>> + struct ttm_place placements[3];
>> struct ttm_placement placement;
>> struct ttm_buffer_object tbo;
>> struct ttm_bo_kmap_obj kmap;
>> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
>> index 2875238..0129c7e 100644
>> --- a/drivers/gpu/drm/radeon/radeon_object.c
>> +++ b/drivers/gpu/drm/radeon/radeon_object.c
>> @@ -97,40 +97,56 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>> {
>> u32 c = 0, i;
>>
>> - rbo->placement.fpfn = 0;
>> - rbo->placement.lpfn = 0;
>> rbo->placement.placement = rbo->placements;
>> rbo->placement.busy_placement = rbo->placements;
>> if (domain & RADEON_GEM_DOMAIN_VRAM)
>> - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
>> - TTM_PL_FLAG_VRAM;
>> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
>> + TTM_PL_FLAG_UNCACHED |
>> + TTM_PL_FLAG_VRAM;
>> +
>> if (domain & RADEON_GEM_DOMAIN_GTT) {
>> if (rbo->flags & RADEON_GEM_GTT_UC) {
>> - rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_TT;
>> + rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
>> + TTM_PL_FLAG_TT;
>> +
>> } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
>> (rbo->rdev->flags & RADEON_IS_AGP)) {
>> - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
>> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
>> + TTM_PL_FLAG_UNCACHED |
>> TTM_PL_FLAG_TT;
>> } else {
>> - rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
>> + rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
>> + TTM_PL_FLAG_TT;
>> }
>> }
>> +
>> if (domain & RADEON_GEM_DOMAIN_CPU) {
>> if (rbo->flags & RADEON_GEM_GTT_UC) {
>> - rbo->placements[c++] = TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_SYSTEM;
>> + rbo->placements[c++].flags = TTM_PL_FLAG_UNCACHED |
>> + TTM_PL_FLAG_SYSTEM;
>> +
>> } else if ((rbo->flags & RADEON_GEM_GTT_WC) ||
>> rbo->rdev->flags & RADEON_IS_AGP) {
>> - rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
>> + rbo->placements[c++].flags = TTM_PL_FLAG_WC |
>> + TTM_PL_FLAG_UNCACHED |
>> TTM_PL_FLAG_SYSTEM;
>> } else {
>> - rbo->placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_SYSTEM;
>> + rbo->placements[c++].flags = TTM_PL_FLAG_CACHED |
>> + TTM_PL_FLAG_SYSTEM;
>> }
>> }
>> if (!c)
>> - rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>> + rbo->placements[c++].flags = TTM_PL_MASK_CACHING |
>> + TTM_PL_FLAG_SYSTEM;
>> +
>> rbo->placement.num_placement = c;
>> rbo->placement.num_busy_placement = c;
>>
>> + for (i = 0; i < c; ++i) {
>> + rbo->placements[i].fpfn = 0;
>> + rbo->placements[i].lpfn = 0;
>> + }
>> +
>> /*
>> * Use two-ended allocation depending on the buffer size to
>> * improve fragmentation quality.
>> @@ -138,7 +154,7 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>> */
>> if (rbo->tbo.mem.size > 512 * 1024) {
>> for (i = 0; i < c; i++) {
>> - rbo->placements[i] |= TTM_PL_FLAG_TOPDOWN;
>> + rbo->placements[i].flags |= TTM_PL_FLAG_TOPDOWN;
>> }
>> }
>> }
>> @@ -287,21 +303,22 @@ int radeon_bo_pin_restricted(struct radeon_bo *bo, u32 domain, u64 max_offset,
>> return 0;
>> }
>> radeon_ttm_placement_from_domain(bo, domain);
>> - if (domain == RADEON_GEM_DOMAIN_VRAM) {
>> + for (i = 0; i < bo->placement.num_placement; i++) {
>> + unsigned lpfn = 0;
>> +
>> /* force to pin into visible video ram */
>> - bo->placement.lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> - }
>> - if (max_offset) {
>> - u64 lpfn = max_offset >> PAGE_SHIFT;
>> + if (bo->placements[i].flags & TTM_PL_FLAG_VRAM)
>> + lpfn = bo->rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> + else
>> + lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT; /* ??? */
>>
>> - if (!bo->placement.lpfn)
>> - bo->placement.lpfn = bo->rdev->mc.gtt_size >> PAGE_SHIFT;
>> + if (max_offset)
>> + lpfn = min (lpfn, (unsigned)(max_offset >> PAGE_SHIFT));
>>
>> - if (lpfn < bo->placement.lpfn)
>> - bo->placement.lpfn = lpfn;
>> + bo->placements[i].lpfn = lpfn;
>> + bo->placements[i].flags |= TTM_PL_FLAG_NO_EVICT;
>> }
>> - for (i = 0; i < bo->placement.num_placement; i++)
>> - bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
>> +
>> r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
>> if (likely(r == 0)) {
>> bo->pin_count = 1;
>> @@ -333,8 +350,10 @@ int radeon_bo_unpin(struct radeon_bo *bo)
>> bo->pin_count--;
>> if (bo->pin_count)
>> return 0;
>> - for (i = 0; i < bo->placement.num_placement; i++)
>> - bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
>> + for (i = 0; i < bo->placement.num_placement; i++) {
>> + bo->placements[i].lpfn = 0;
>> + bo->placements[i].flags &= ~TTM_PL_FLAG_NO_EVICT;
>> + }
>> r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false);
>> if (likely(r == 0)) {
>> if (bo->tbo.mem.mem_type == TTM_PL_VRAM)
>> @@ -735,7 +754,7 @@ int radeon_bo_fault_reserve_notify(struct ttm_buffer_object *bo)
>>
>> /* hurrah the memory is not visible ! */
>> radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_VRAM);
>> - rbo->placement.lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> + rbo->placements[0].lpfn = rdev->mc.visible_vram_size >> PAGE_SHIFT;
>> r = ttm_bo_validate(bo, &rbo->placement, false, false);
>> if (unlikely(r == -ENOMEM)) {
>> radeon_ttm_placement_from_domain(rbo, RADEON_GEM_DOMAIN_GTT);
>> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
>> index 12e37b1..822eb36 100644
>> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
>> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
>> @@ -178,12 +178,15 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
>> static void radeon_evict_flags(struct ttm_buffer_object *bo,
>> struct ttm_placement *placement)
>> {
>> + static struct ttm_place placements = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM
>> + };
>> +
>> struct radeon_bo *rbo;
>> - static u32 placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
>>
>> if (!radeon_ttm_bo_is_radeon_bo(bo)) {
>> - placement->fpfn = 0;
>> - placement->lpfn = 0;
>> placement->placement = &placements;
>> placement->busy_placement = &placements;
>> placement->num_placement = 1;
>> @@ -286,20 +289,20 @@ static int radeon_move_vram_ram(struct ttm_buffer_object *bo,
>> struct radeon_device *rdev;
>> struct ttm_mem_reg *old_mem = &bo->mem;
>> struct ttm_mem_reg tmp_mem;
>> - u32 placements;
>> + struct ttm_place placements;
>> struct ttm_placement placement;
>> int r;
>>
>> rdev = radeon_get_rdev(bo->bdev);
>> tmp_mem = *new_mem;
>> tmp_mem.mm_node = NULL;
>> - placement.fpfn = 0;
>> - placement.lpfn = 0;
>> placement.num_placement = 1;
>> placement.placement = &placements;
>> placement.num_busy_placement = 1;
>> placement.busy_placement = &placements;
>> - placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
>> + placements.fpfn = 0;
>> + placements.lpfn = 0;
>> + placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
>> r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
>> interruptible, no_wait_gpu);
>> if (unlikely(r)) {
>> @@ -334,19 +337,19 @@ static int radeon_move_ram_vram(struct ttm_buffer_object *bo,
>> struct ttm_mem_reg *old_mem = &bo->mem;
>> struct ttm_mem_reg tmp_mem;
>> struct ttm_placement placement;
>> - u32 placements;
>> + struct ttm_place placements;
>> int r;
>>
>> rdev = radeon_get_rdev(bo->bdev);
>> tmp_mem = *new_mem;
>> tmp_mem.mm_node = NULL;
>> - placement.fpfn = 0;
>> - placement.lpfn = 0;
>> placement.num_placement = 1;
>> placement.placement = &placements;
>> placement.num_busy_placement = 1;
>> placement.busy_placement = &placements;
>> - placements = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
>> + placements.fpfn = 0;
>> + placements.lpfn = 0;
>> + placements.flags = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
>> r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
>> interruptible, no_wait_gpu);
>> if (unlikely(r)) {
>> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
>> index 6bf55ec..1168de7 100644
>> --- a/drivers/gpu/drm/radeon/radeon_uvd.c
>> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c
>> @@ -233,8 +233,12 @@ int radeon_uvd_resume(struct radeon_device *rdev)
>>
>> void radeon_uvd_force_into_uvd_segment(struct radeon_bo *rbo)
>> {
>> - rbo->placement.fpfn = 0 >> PAGE_SHIFT;
>> - rbo->placement.lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
>> + int i;
>> +
>> + for (i = 0; i < rbo->placement.num_placement; ++i) {
>> + rbo->placements[i].fpfn = 0 >> PAGE_SHIFT;
>> + rbo->placements[i].lpfn = (256 * 1024 * 1024) >> PAGE_SHIFT;
>> + }
>> }
>>
>> void radeon_uvd_free_handles(struct radeon_device *rdev, struct drm_file *filp)
>> diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c
>> index 3da89d5..b992ec3 100644
>> --- a/drivers/gpu/drm/ttm/ttm_bo.c
>> +++ b/drivers/gpu/drm/ttm/ttm_bo.c
>> @@ -53,12 +53,13 @@ static struct attribute ttm_bo_count = {
>> .mode = S_IRUGO
>> };
>>
>> -static inline int ttm_mem_type_from_flags(uint32_t flags, uint32_t *mem_type)
>> +static inline int ttm_mem_type_from_place(const struct ttm_place *place,
>> + uint32_t *mem_type)
>> {
>> int i;
>>
>> for (i = 0; i <= TTM_PL_PRIV5; i++)
>> - if (flags & (1 << i)) {
>> + if (place->flags & (1 << i)) {
>> *mem_type = i;
>> return 0;
>> }
>> @@ -89,12 +90,12 @@ static void ttm_bo_mem_space_debug(struct ttm_buffer_object *bo,
>> bo, bo->mem.num_pages, bo->mem.size >> 10,
>> bo->mem.size >> 20);
>> for (i = 0; i < placement->num_placement; i++) {
>> - ret = ttm_mem_type_from_flags(placement->placement[i],
>> + ret = ttm_mem_type_from_place(&placement->placement[i],
>> &mem_type);
>> if (ret)
>> return;
>> pr_err(" placement[%d]=0x%08X (%d)\n",
>> - i, placement->placement[i], mem_type);
>> + i, placement->placement[i].flags, mem_type);
>> ttm_mem_type_debug(bo->bdev, mem_type);
>> }
>> }
>> @@ -685,8 +686,6 @@ static int ttm_bo_evict(struct ttm_buffer_object *bo, bool interruptible,
>> evict_mem.bus.io_reserved_vm = false;
>> evict_mem.bus.io_reserved_count = 0;
>>
>> - placement.fpfn = 0;
>> - placement.lpfn = 0;
>> placement.num_placement = 0;
>> placement.num_busy_placement = 0;
>> bdev->driver->evict_flags(bo, &placement);
>> @@ -774,7 +773,7 @@ EXPORT_SYMBOL(ttm_bo_mem_put);
>> */
>> static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
>> uint32_t mem_type,
>> - struct ttm_placement *placement,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem,
>> bool interruptible,
>> bool no_wait_gpu)
>> @@ -784,7 +783,7 @@ static int ttm_bo_mem_force_space(struct ttm_buffer_object *bo,
>> int ret;
>>
>> do {
>> - ret = (*man->func->get_node)(man, bo, placement, 0, mem);
>> + ret = (*man->func->get_node)(man, bo, place, mem);
>> if (unlikely(ret != 0))
>> return ret;
>> if (mem->mm_node)
>> @@ -827,18 +826,18 @@ static uint32_t ttm_bo_select_caching(struct ttm_mem_type_manager *man,
>>
>> static bool ttm_bo_mt_compatible(struct ttm_mem_type_manager *man,
>> uint32_t mem_type,
>> - uint32_t proposed_placement,
>> + const struct ttm_place *place,
>> uint32_t *masked_placement)
>> {
>> uint32_t cur_flags = ttm_bo_type_flags(mem_type);
>>
>> - if ((cur_flags & proposed_placement & TTM_PL_MASK_MEM) == 0)
>> + if ((cur_flags & place->flags & TTM_PL_MASK_MEM) == 0)
>> return false;
>>
>> - if ((proposed_placement & man->available_caching) == 0)
>> + if ((place->flags & man->available_caching) == 0)
>> return false;
>>
>> - cur_flags |= (proposed_placement & man->available_caching);
>> + cur_flags |= (place->flags & man->available_caching);
>>
>> *masked_placement = cur_flags;
>> return true;
>> @@ -869,15 +868,14 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>
>> mem->mm_node = NULL;
>> for (i = 0; i < placement->num_placement; ++i) {
>> - ret = ttm_mem_type_from_flags(placement->placement[i],
>> - &mem_type);
>> + const struct ttm_place *place = &placement->placement[i];
>> +
>> + ret = ttm_mem_type_from_place(place, &mem_type);
>> if (ret)
>> return ret;
>> man = &bdev->man[mem_type];
>>
>> - type_ok = ttm_bo_mt_compatible(man,
>> - mem_type,
>> - placement->placement[i],
>> + type_ok = ttm_bo_mt_compatible(man, mem_type, place,
>> &cur_flags);
>>
>> if (!type_ok)
>> @@ -889,7 +887,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>> * Use the access and other non-mapping-related flag bits from
>> * the memory placement flags to the current flags
>> */
>> - ttm_flag_masked(&cur_flags, placement->placement[i],
>> + ttm_flag_masked(&cur_flags, place->flags,
>> ~TTM_PL_MASK_MEMTYPE);
>>
>> if (mem_type == TTM_PL_SYSTEM)
>> @@ -897,8 +895,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>>
>> if (man->has_type && man->use_type) {
>> type_found = true;
>> - ret = (*man->func->get_node)(man, bo, placement,
>> - cur_flags, mem);
>> + ret = (*man->func->get_node)(man, bo, place, mem);
>> if (unlikely(ret))
>> return ret;
>> }
>> @@ -916,17 +913,15 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>> return -EINVAL;
>>
>> for (i = 0; i < placement->num_busy_placement; ++i) {
>> - ret = ttm_mem_type_from_flags(placement->busy_placement[i],
>> - &mem_type);
>> + const struct ttm_place *place = &placement->busy_placement[i];
>> +
>> + ret = ttm_mem_type_from_place(place, &mem_type);
>> if (ret)
>> return ret;
>> man = &bdev->man[mem_type];
>> if (!man->has_type)
>> continue;
>> - if (!ttm_bo_mt_compatible(man,
>> - mem_type,
>> - placement->busy_placement[i],
>> - &cur_flags))
>> + if (!ttm_bo_mt_compatible(man, mem_type, place, &cur_flags))
>> continue;
>>
>> cur_flags = ttm_bo_select_caching(man, bo->mem.placement,
>> @@ -935,7 +930,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>> * Use the access and other non-mapping-related flag bits from
>> * the memory placement flags to the current flags
>> */
>> - ttm_flag_masked(&cur_flags, placement->busy_placement[i],
>> + ttm_flag_masked(&cur_flags, place->flags,
>> ~TTM_PL_MASK_MEMTYPE);
>>
>> if (mem_type == TTM_PL_SYSTEM) {
>> @@ -945,7 +940,7 @@ int ttm_bo_mem_space(struct ttm_buffer_object *bo,
>> return 0;
>> }
>>
>> - ret = ttm_bo_mem_force_space(bo, mem_type, placement, mem,
>> + ret = ttm_bo_mem_force_space(bo, mem_type, place, mem,
>> interruptible, no_wait_gpu);
>> if (ret == 0 && mem->mm_node) {
>> mem->placement = cur_flags;
>> @@ -1006,20 +1001,27 @@ static bool ttm_bo_mem_compat(struct ttm_placement *placement,
>> {
>> int i;
>>
>> - if (mem->mm_node && placement->lpfn != 0 &&
>> - (mem->start < placement->fpfn ||
>> - mem->start + mem->num_pages > placement->lpfn))
>> - return false;
>> -
>> for (i = 0; i < placement->num_placement; i++) {
>> - *new_flags = placement->placement[i];
>> + const struct ttm_place *heap = &placement->placement[i];
>> + if (mem->mm_node && heap->lpfn != 0 &&
>> + (mem->start < heap->fpfn ||
>> + mem->start + mem->num_pages > heap->lpfn))
>> + continue;
>> +
>> + *new_flags = heap->flags;
>> if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
>> (*new_flags & mem->placement & TTM_PL_MASK_MEM))
>> return true;
>> }
>>
>> for (i = 0; i < placement->num_busy_placement; i++) {
>> - *new_flags = placement->busy_placement[i];
>> + const struct ttm_place *heap = &placement->busy_placement[i];
>> + if (mem->mm_node && heap->lpfn != 0 &&
>> + (mem->start < heap->fpfn ||
>> + mem->start + mem->num_pages > heap->lpfn))
>> + continue;
>> +
>> + *new_flags = heap->flags;
>> if ((*new_flags & mem->placement & TTM_PL_MASK_CACHING) &&
>> (*new_flags & mem->placement & TTM_PL_MASK_MEM))
>> return true;
>> @@ -1037,11 +1039,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
>> uint32_t new_flags;
>>
>> lockdep_assert_held(&bo->resv->lock.base);
>> - /* Check that range is valid */
>> - if (placement->lpfn || placement->fpfn)
>> - if (placement->fpfn > placement->lpfn ||
>> - (placement->lpfn - placement->fpfn) < bo->num_pages)
>> - return -EINVAL;
>> /*
>> * Check whether we need to move buffer.
>> */
>> @@ -1070,15 +1067,6 @@ int ttm_bo_validate(struct ttm_buffer_object *bo,
>> }
>> EXPORT_SYMBOL(ttm_bo_validate);
>>
>> -int ttm_bo_check_placement(struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement)
>> -{
>> - BUG_ON((placement->fpfn || placement->lpfn) &&
>> - (bo->mem.num_pages > (placement->lpfn - placement->fpfn)));
>> -
>> - return 0;
>> -}
>> -
>> int ttm_bo_init(struct ttm_bo_device *bdev,
>> struct ttm_buffer_object *bo,
>> unsigned long size,
>> @@ -1147,15 +1135,12 @@ int ttm_bo_init(struct ttm_bo_device *bdev,
>> atomic_inc(&bo->glob->bo_count);
>> drm_vma_node_reset(&bo->vma_node);
>>
>> - ret = ttm_bo_check_placement(bo, placement);
>> -
>> /*
>> * For ttm_bo_type_device buffers, allocate
>> * address space from the device.
>> */
>> - if (likely(!ret) &&
>> - (bo->type == ttm_bo_type_device ||
>> - bo->type == ttm_bo_type_sg))
>> + if (bo->type == ttm_bo_type_device ||
>> + bo->type == ttm_bo_type_sg)
>> ret = drm_vma_offset_add(&bdev->vma_manager, &bo->vma_node,
>> bo->mem.num_pages);
>>
>> diff --git a/drivers/gpu/drm/ttm/ttm_bo_manager.c b/drivers/gpu/drm/ttm/ttm_bo_manager.c
>> index 9e103a48..964387f 100644
>> --- a/drivers/gpu/drm/ttm/ttm_bo_manager.c
>> +++ b/drivers/gpu/drm/ttm/ttm_bo_manager.c
>> @@ -49,8 +49,7 @@ struct ttm_range_manager {
>>
>> static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
>> struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement,
>> - uint32_t flags,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem)
>> {
>> struct ttm_range_manager *rman = (struct ttm_range_manager *) man->priv;
>> @@ -60,7 +59,7 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
>> unsigned long lpfn;
>> int ret;
>>
>> - lpfn = placement->lpfn;
>> + lpfn = place->lpfn;
>> if (!lpfn)
>> lpfn = man->size;
>>
>> @@ -68,13 +67,13 @@ static int ttm_bo_man_get_node(struct ttm_mem_type_manager *man,
>> if (!node)
>> return -ENOMEM;
>>
>> - if (flags & TTM_PL_FLAG_TOPDOWN)
>> + if (place->flags & TTM_PL_FLAG_TOPDOWN)
>> aflags = DRM_MM_CREATE_TOP;
>>
>> spin_lock(&rman->lock);
>> ret = drm_mm_insert_node_in_range_generic(mm, node, mem->num_pages,
>> mem->page_alignment, 0,
>> - placement->fpfn, lpfn,
>> + place->fpfn, lpfn,
>> DRM_MM_SEARCH_BEST,
>> aflags);
>> spin_unlock(&rman->lock);
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
>> index 6327cfc..37c093c 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
>> @@ -30,66 +30,101 @@
>> #include <drm/ttm/ttm_placement.h>
>> #include <drm/ttm/ttm_page_alloc.h>
>>
>> -static uint32_t vram_placement_flags = TTM_PL_FLAG_VRAM |
>> - TTM_PL_FLAG_CACHED;
>> -
>> -static uint32_t vram_ne_placement_flags = TTM_PL_FLAG_VRAM |
>> - TTM_PL_FLAG_CACHED |
>> - TTM_PL_FLAG_NO_EVICT;
>> +static struct ttm_place vram_placement_flags = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
>> +};
>>
>> -static uint32_t sys_placement_flags = TTM_PL_FLAG_SYSTEM |
>> - TTM_PL_FLAG_CACHED;
>> +static struct ttm_place vram_ne_placement_flags = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
>> +};
>>
>> -static uint32_t sys_ne_placement_flags = TTM_PL_FLAG_SYSTEM |
>> - TTM_PL_FLAG_CACHED |
>> - TTM_PL_FLAG_NO_EVICT;
>> +static struct ttm_place sys_placement_flags = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
>> +};
>>
>> -static uint32_t gmr_placement_flags = VMW_PL_FLAG_GMR |
>> - TTM_PL_FLAG_CACHED;
>> +static struct ttm_place sys_ne_placement_flags = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
>> +};
>>
>> -static uint32_t gmr_ne_placement_flags = VMW_PL_FLAG_GMR |
>> - TTM_PL_FLAG_CACHED |
>> - TTM_PL_FLAG_NO_EVICT;
>> +static struct ttm_place gmr_placement_flags = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
>> +};
>>
>> -static uint32_t mob_placement_flags = VMW_PL_FLAG_MOB |
>> - TTM_PL_FLAG_CACHED;
>> +static struct ttm_place gmr_ne_placement_flags = {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
>> +};
>>
>> -struct ttm_placement vmw_vram_placement = {
>> +static struct ttm_place mob_placement_flags = {
>> .fpfn = 0,
>> .lpfn = 0,
>> + .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
>> +};
>> +
>> +struct ttm_placement vmw_vram_placement = {
>> .num_placement = 1,
>> .placement = &vram_placement_flags,
>> .num_busy_placement = 1,
>> .busy_placement = &vram_placement_flags
>> };
>>
>> -static uint32_t vram_gmr_placement_flags[] = {
>> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
>> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
>> +static struct ttm_place vram_gmr_placement_flags[] = {
>> + {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
>> + }, {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
>> + }
>> };
>>
>> -static uint32_t gmr_vram_placement_flags[] = {
>> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED,
>> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
>> +static struct ttm_place gmr_vram_placement_flags[] = {
>> + {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
>> + }, {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
>> + }
>> };
>>
>> struct ttm_placement vmw_vram_gmr_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 2,
>> .placement = vram_gmr_placement_flags,
>> .num_busy_placement = 1,
>> .busy_placement = &gmr_placement_flags
>> };
>>
>> -static uint32_t vram_gmr_ne_placement_flags[] = {
>> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT,
>> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED | TTM_PL_FLAG_NO_EVICT
>> +static struct ttm_place vram_gmr_ne_placement_flags[] = {
>> + {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED |
>> + TTM_PL_FLAG_NO_EVICT
>> + }, {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED |
>> + TTM_PL_FLAG_NO_EVICT
>> + }
>> };
>>
>> struct ttm_placement vmw_vram_gmr_ne_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 2,
>> .placement = vram_gmr_ne_placement_flags,
>> .num_busy_placement = 1,
>> @@ -97,8 +132,6 @@ struct ttm_placement vmw_vram_gmr_ne_placement = {
>> };
>>
>> struct ttm_placement vmw_vram_sys_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 1,
>> .placement = &vram_placement_flags,
>> .num_busy_placement = 1,
>> @@ -106,8 +139,6 @@ struct ttm_placement vmw_vram_sys_placement = {
>> };
>>
>> struct ttm_placement vmw_vram_ne_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 1,
>> .placement = &vram_ne_placement_flags,
>> .num_busy_placement = 1,
>> @@ -115,8 +146,6 @@ struct ttm_placement vmw_vram_ne_placement = {
>> };
>>
>> struct ttm_placement vmw_sys_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 1,
>> .placement = &sys_placement_flags,
>> .num_busy_placement = 1,
>> @@ -124,24 +153,33 @@ struct ttm_placement vmw_sys_placement = {
>> };
>>
>> struct ttm_placement vmw_sys_ne_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 1,
>> .placement = &sys_ne_placement_flags,
>> .num_busy_placement = 1,
>> .busy_placement = &sys_ne_placement_flags
>> };
>>
>> -static uint32_t evictable_placement_flags[] = {
>> - TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED,
>> - TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED,
>> - VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED,
>> - VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
>> +static struct ttm_place evictable_placement_flags[] = {
>> + {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED
>> + }, {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = TTM_PL_FLAG_VRAM | TTM_PL_FLAG_CACHED
>> + }, {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_GMR | TTM_PL_FLAG_CACHED
>> + }, {
>> + .fpfn = 0,
>> + .lpfn = 0,
>> + .flags = VMW_PL_FLAG_MOB | TTM_PL_FLAG_CACHED
>> + }
>> };
>>
>> struct ttm_placement vmw_evictable_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 4,
>> .placement = evictable_placement_flags,
>> .num_busy_placement = 1,
>> @@ -149,8 +187,6 @@ struct ttm_placement vmw_evictable_placement = {
>> };
>>
>> struct ttm_placement vmw_srf_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 1,
>> .num_busy_placement = 2,
>> .placement = &gmr_placement_flags,
>> @@ -158,8 +194,6 @@ struct ttm_placement vmw_srf_placement = {
>> };
>>
>> struct ttm_placement vmw_mob_placement = {
>> - .fpfn = 0,
>> - .lpfn = 0,
>> .num_placement = 1,
>> .num_busy_placement = 1,
>> .placement = &mob_placement_flags,
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
>> index ed1d510..914b375 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c
>> @@ -198,13 +198,19 @@ int vmw_dmabuf_to_start_of_vram(struct vmw_private *dev_priv,
>> {
>> struct ttm_buffer_object *bo = &buf->base;
>> struct ttm_placement placement;
>> + struct ttm_place place;
>> int ret = 0;
>>
>> if (pin)
>> - placement = vmw_vram_ne_placement;
>> + place = vmw_vram_ne_placement.placement[0];
>> else
>> - placement = vmw_vram_placement;
>> - placement.lpfn = bo->num_pages;
>> + place = vmw_vram_placement.placement[0];
>> + place.lpfn = bo->num_pages;
>> +
>> + placement.num_placement = 1;
>> + placement.placement = &place;
>> + placement.num_busy_placement = 1;
>> + placement.busy_placement = &place;
>>
>> ret = ttm_write_lock(&dev_priv->reservation_sem, interruptible);
>> if (unlikely(ret != 0))
>> @@ -293,21 +299,23 @@ void vmw_bo_get_guest_ptr(const struct ttm_buffer_object *bo,
>> */
>> void vmw_bo_pin(struct ttm_buffer_object *bo, bool pin)
>> {
>> - uint32_t pl_flags;
>> + struct ttm_place pl;
>> struct ttm_placement placement;
>> uint32_t old_mem_type = bo->mem.mem_type;
>> int ret;
>>
>> lockdep_assert_held(&bo->resv->lock.base);
>>
>> - pl_flags = TTM_PL_FLAG_VRAM | VMW_PL_FLAG_GMR | VMW_PL_FLAG_MOB
>> + pl.fpfn = 0;
>> + pl.lpfn = 0;
>> + pl.flags = TTM_PL_FLAG_VRAM | VMW_PL_FLAG_GMR | VMW_PL_FLAG_MOB
>> | TTM_PL_FLAG_SYSTEM | TTM_PL_FLAG_CACHED;
>> if (pin)
>> - pl_flags |= TTM_PL_FLAG_NO_EVICT;
>> + pl.flags |= TTM_PL_FLAG_NO_EVICT;
>>
>> memset(&placement, 0, sizeof(placement));
>> placement.num_placement = 1;
>> - placement.placement = &pl_flags;
>> + placement.placement = &pl;
>>
>> ret = ttm_bo_validate(bo, &placement, false, true);
>>
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
>> index b031b48..0a474f3 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
>> @@ -374,10 +374,16 @@ static int vmw_fb_create_bo(struct vmw_private *vmw_priv,
>> size_t size, struct vmw_dma_buffer **out)
>> {
>> struct vmw_dma_buffer *vmw_bo;
>> - struct ttm_placement ne_placement = vmw_vram_ne_placement;
>> + struct ttm_place ne_place = vmw_vram_ne_placement.placement[0];
>> + struct ttm_placement ne_placement;
>> int ret;
>>
>> - ne_placement.lpfn = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
>> + ne_placement.num_placement = 1;
>> + ne_placement.placement = &ne_place;
>> + ne_placement.num_busy_placement = 1;
>> + ne_placement.busy_placement = &ne_place;
>> +
>> + ne_place.lpfn = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
>>
>> (void) ttm_write_lock(&vmw_priv->reservation_sem, false);
>>
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
>> index 26f8bdd..170b61b 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c
>> @@ -46,8 +46,7 @@ struct vmwgfx_gmrid_man {
>>
>> static int vmw_gmrid_man_get_node(struct ttm_mem_type_manager *man,
>> struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement,
>> - uint32_t flags,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem)
>> {
>> struct vmwgfx_gmrid_man *gman =
>> diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h
>> index 7526c5b..e3d39c8 100644
>> --- a/include/drm/ttm/ttm_bo_api.h
>> +++ b/include/drm/ttm/ttm_bo_api.h
>> @@ -45,12 +45,24 @@ struct ttm_bo_device;
>>
>> struct drm_mm_node;
>>
>> +/**
>> + * struct ttm_place
>> + *
>> + * @fpfn: first valid page frame number to put the object
>> + * @lpfn: last valid page frame number to put the object
>> + * @flags: memory domain and caching flags for the object
>> + *
>> + * Structure indicating a possible place to put an object.
>> + */
>> +struct ttm_place {
>> + unsigned fpfn;
>> + unsigned lpfn;
>> + uint32_t flags;
>> +};
>>
>> /**
>> * struct ttm_placement
>> *
>> - * @fpfn: first valid page frame number to put the object
>> - * @lpfn: last valid page frame number to put the object
>> * @num_placement: number of preferred placements
>> * @placement: preferred placements
>> * @num_busy_placement: number of preferred placements when need to evict buffer
>> @@ -59,12 +71,10 @@ struct drm_mm_node;
>> * Structure indicating the placement you request for an object.
>> */
>> struct ttm_placement {
>> - unsigned fpfn;
>> - unsigned lpfn;
>> - unsigned num_placement;
>> - const uint32_t *placement;
>> - unsigned num_busy_placement;
>> - const uint32_t *busy_placement;
>> + unsigned num_placement;
>> + const struct ttm_place *placement;
>> + unsigned num_busy_placement;
>> + const struct ttm_place *busy_placement;
>> };
>>
>> /**
>> @@ -519,20 +529,6 @@ extern int ttm_bo_create(struct ttm_bo_device *bdev,
>> struct ttm_buffer_object **p_bo);
>>
>> /**
>> - * ttm_bo_check_placement
>> - *
>> - * @bo: the buffer object.
>> - * @placement: placements
>> - *
>> - * Performs minimal validity checking on an intended change of
>> - * placement flags.
>> - * Returns
>> - * -EINVAL: Intended change is invalid or not allowed.
>> - */
>> -extern int ttm_bo_check_placement(struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement);
>> -
>> -/**
>> * ttm_bo_init_mm
>> *
>> * @bdev: Pointer to a ttm_bo_device struct.
>> diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
>> index 202f0a7..426bf84 100644
>> --- a/include/drm/ttm/ttm_bo_driver.h
>> +++ b/include/drm/ttm/ttm_bo_driver.h
>> @@ -206,8 +206,7 @@ struct ttm_mem_type_manager_func {
>> */
>> int (*get_node)(struct ttm_mem_type_manager *man,
>> struct ttm_buffer_object *bo,
>> - struct ttm_placement *placement,
>> - uint32_t flags,
>> + const struct ttm_place *place,
>> struct ttm_mem_reg *mem);
>>
>> /**
>> --
>> 1.9.1
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 7+ messages in thread* Re: [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
2014-08-26 11:28 ` Christian König
@ 2014-08-27 4:21 ` Dave Airlie
2014-08-27 11:34 ` Christian König
0 siblings, 1 reply; 7+ messages in thread
From: Dave Airlie @ 2014-08-27 4:21 UTC (permalink / raw)
To: Christian König; +Cc: Maling list - DRI developers
On 26 August 2014 21:28, Christian König <deathsimple@vodafone.de> wrote:
> Hi Dave,
>
> any preferences how I can push this change upstream?
>
> Since it affects a whole bunch of drivers it would be nice if I could get
> more reviews and/or acks on it. And if we just push it to you through the
> Radeon tree it will probably cause a bunch of merge conflicts.
Can you send me a separate git tree base on drm-next and I'll pull it
into drm-next directly.
Though it would be nice to get some acks on it, it doesn't look like a
major amount of damage could be caused and -next should pick it up.
Dave.
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
2014-08-27 4:21 ` Dave Airlie
@ 2014-08-27 11:34 ` Christian König
0 siblings, 0 replies; 7+ messages in thread
From: Christian König @ 2014-08-27 11:34 UTC (permalink / raw)
To: Dave Airlie; +Cc: Maling list - DRI developers
Hi Dave,
Am 27.08.2014 um 06:21 schrieb Dave Airlie:
> On 26 August 2014 21:28, Christian König <deathsimple@vodafone.de> wrote:
>> Hi Dave,
>>
>> any preferences how I can push this change upstream?
>>
>> Since it affects a whole bunch of drivers it would be nice if I could get
>> more reviews and/or acks on it. And if we just push it to you through the
>> Radeon tree it will probably cause a bunch of merge conflicts.
> Can you send me a separate git tree base on drm-next and I'll pull it
> into drm-next directly.
Sounds good, branch is on FDO and formal pull request below.
> Though it would be nice to get some acks on it, it doesn't look like a
> major amount of damage could be caused and -next should pick it up.
Agree, the change is rather straight forward.
My most concern is that I somehow missed something that only driver
maintainers know about, but I can confirm that all changed drivers still
compile fine on my box.
If anybody has additional comments on the patch or wants to give an
rb/ab just send a mail, the patch is on the list for quite a while now.
Regards,
Christian.
The following changes since commit 484048db6b4890bc433aac7f5e32fdcf1b2b4786:
Merge branch 'drm-next-3.18' of
git://people.freedesktop.org/~agd5f/linux into drm-next (2014-08-26
09:05:14 +1000)
are available in the git repository at:
git://people.freedesktop.org/~deathsimple/linux ttm_pfn
for you to fetch changes up to f1217ed09f827e42a49ffa6a5aab672aa6f57a65:
drm/ttm: move fpfn and lpfn into each placement v2 (2014-08-27
13:16:04 +0200)
----------------------------------------------------------------
Christian König (1):
drm/ttm: move fpfn and lpfn into each placement v2
drivers/gpu/drm/ast/ast_drv.h | 2 +-
drivers/gpu/drm/ast/ast_ttm.c | 20 ++++++++------
drivers/gpu/drm/bochs/bochs.h | 2 +-
drivers/gpu/drm/bochs/bochs_mm.c | 20 +++++++++-----
drivers/gpu/drm/cirrus/cirrus_drv.h | 2 +-
drivers/gpu/drm/cirrus/cirrus_ttm.c | 17 +++++++-----
drivers/gpu/drm/mgag200/mgag200_drv.h | 2 +-
drivers/gpu/drm/mgag200/mgag200_ttm.c | 20 ++++++++------
drivers/gpu/drm/nouveau/nouveau_bo.c | 52
++++++++++++++++++++++++-----------
drivers/gpu/drm/nouveau/nouveau_bo.h | 4 +--
drivers/gpu/drm/nouveau/nouveau_ttm.c | 9 +++----
drivers/gpu/drm/qxl/qxl_drv.h | 2 +-
drivers/gpu/drm/qxl/qxl_object.c | 17 +++++++-----
drivers/gpu/drm/qxl/qxl_ttm.c | 8 +++---
drivers/gpu/drm/radeon/radeon.h | 2 +-
drivers/gpu/drm/radeon/radeon_object.c | 71
++++++++++++++++++++++++++++++------------------
drivers/gpu/drm/radeon/radeon_ttm.c | 25 +++++++++--------
drivers/gpu/drm/radeon/radeon_uvd.c | 8 ++++--
drivers/gpu/drm/ttm/ttm_bo.c | 93
+++++++++++++++++++++++++++------------------------------------
drivers/gpu/drm/ttm/ttm_bo_manager.c | 9 +++----
drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 136
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
drivers/gpu/drm/vmwgfx/vmwgfx_dmabuf.c | 22 ++++++++++-----
drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 10 +++++--
drivers/gpu/drm/vmwgfx/vmwgfx_gmrid_manager.c | 3 +--
include/drm/ttm/ttm_bo_api.h | 40
+++++++++++++--------------
include/drm/ttm/ttm_bo_driver.h | 3 +--
26 files changed, 346 insertions(+), 253 deletions(-)
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
2014-08-22 8:13 [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Christian König
2014-08-22 8:13 ` [PATCH 2/2] drm/radeon: allow UVD to use a second 256MB segment Christian König
2014-08-25 15:51 ` [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Alex Deucher
@ 2014-08-28 1:51 ` Michel Dänzer
2 siblings, 0 replies; 7+ messages in thread
From: Michel Dänzer @ 2014-08-28 1:51 UTC (permalink / raw)
To: Christian König; +Cc: dri-devel
On 22.08.2014 17:13, Christian König wrote:
> From: Christian König <christian.koenig@amd.com>
>
> This allows us to more fine grained specify where to place the buffer object.
>
> Signed-off-by: Christian König <christian.koenig@amd.com>
Tested-and-Acked-by: Michel Dänzer <michel.daenzer@amd.com>
(for radeon)
--
Earthling Michel Dänzer | http://www.amd.com
Libre software enthusiast | Mesa and X developer
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2014-08-28 1:51 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-08-22 8:13 [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Christian König
2014-08-22 8:13 ` [PATCH 2/2] drm/radeon: allow UVD to use a second 256MB segment Christian König
2014-08-25 15:51 ` [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement Alex Deucher
2014-08-26 11:28 ` Christian König
2014-08-27 4:21 ` Dave Airlie
2014-08-27 11:34 ` Christian König
2014-08-28 1:51 ` Michel Dänzer
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.