All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christian König" <deathsimple@vodafone.de>
To: Alex Deucher <alexdeucher@gmail.com>
Cc: Maling list - DRI developers <dri-devel@lists.freedesktop.org>
Subject: Re: [PATCH 1/2] drm/ttm: move fpfn and lpfn into each placement
Date: Tue, 26 Aug 2014 13:28:28 +0200	[thread overview]
Message-ID: <53FC6F5C.9050501@vodafone.de> (raw)
In-Reply-To: <CADnq5_O6Z9exU-ZNQ0NOyOEa7nv6-aVBBGju80M1A5+q2JNJAA@mail.gmail.com>

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

  reply	other threads:[~2014-08-26 11:29 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
2014-08-27  4:21     ` Dave Airlie
2014-08-27 11:34       ` Christian König
2014-08-28  1:51 ` Michel Dänzer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53FC6F5C.9050501@vodafone.de \
    --to=deathsimple@vodafone.de \
    --cc=alexdeucher@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.