return __ffs(vram_bo_flag >> (__ffs(XE_BO_FLAG_VRAM0) - 1)) - 1;
}
-static u32 bo_vram_flags_to_vram_placement(struct xe_device *xe, u32 vram_flag,
+static u32 bo_vram_flags_to_vram_placement(struct xe_device *xe, u32 bo_flags, u32 vram_flag,
enum ttm_bo_type type)
{
u8 tile_id = vram_bo_flag_to_tile_id(xe, vram_flag);
xe_assert(xe, tile_id < xe->info.tile_count);
- if (type == ttm_bo_type_kernel)
+ if (type == ttm_bo_type_kernel && !(bo_flags & XE_BO_FLAG_FORCE_USER_VRAM))
return xe->tiles[tile_id].mem.kernel_vram->placement;
else
return xe->tiles[tile_id].mem.vram->placement;
u32 vram_flag;
for_each_set_bo_vram_flag(vram_flag, bo_flags) {
- u32 pl = bo_vram_flags_to_vram_placement(xe, vram_flag, type);
+ u32 pl = bo_vram_flags_to_vram_placement(xe, bo_flags, vram_flag, type);
add_vram(xe, bo, bo->placements, bo_flags, pl, c);
}
if (flags & XE_BO_FLAG_STOLEN)
place->mem_type = XE_PL_STOLEN;
else
- place->mem_type = bo_vram_flags_to_vram_placement(xe, vram_flag, type);
+ place->mem_type = bo_vram_flags_to_vram_placement(xe, flags, vram_flag, type);
bo->placement = (struct ttm_placement) {
.num_placement = 1,
#define XE_BO_FLAG_GGTT2 BIT(22)
#define XE_BO_FLAG_GGTT3 BIT(23)
#define XE_BO_FLAG_CPU_ADDR_MIRROR BIT(24)
+#define XE_BO_FLAG_FORCE_USER_VRAM BIT(25)
/* this one is trigger internally only */
#define XE_BO_FLAG_INTERNAL_TEST BIT(30)