mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-07 02:48:06 +02:00
iris: handle protected BO creation
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@intel.com> Reviewed-by: Tapani Pälli <tapani.palli@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8092>
This commit is contained in:
parent
5d88ab63e2
commit
9402ac8023
4 changed files with 56 additions and 29 deletions
|
|
@ -871,7 +871,8 @@ alloc_bo_from_cache(struct iris_bufmgr *bufmgr,
|
||||||
unsigned flags,
|
unsigned flags,
|
||||||
bool match_zone)
|
bool match_zone)
|
||||||
{
|
{
|
||||||
if (!bucket)
|
/* Don't put anything protected in the BO cache. */
|
||||||
|
if (!bucket || (flags & BO_ALLOC_PROTECTED))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
struct iris_bo *bo = NULL;
|
struct iris_bo *bo = NULL;
|
||||||
|
|
@ -964,42 +965,56 @@ alloc_fresh_bo(struct iris_bufmgr *bufmgr, uint64_t bo_size, unsigned flags)
|
||||||
/* If we have vram size, we have multiple memory regions and should choose
|
/* If we have vram size, we have multiple memory regions and should choose
|
||||||
* one of them.
|
* one of them.
|
||||||
*/
|
*/
|
||||||
if (bufmgr->vram.size > 0) {
|
if (bufmgr->vram.size > 0 || flags & BO_ALLOC_PROTECTED) {
|
||||||
/* All new BOs we get from the kernel are zeroed, so we don't need to
|
/* All new BOs we get from the kernel are zeroed, so we don't need to
|
||||||
* worry about that here.
|
* worry about that here.
|
||||||
*/
|
*/
|
||||||
struct drm_i915_gem_memory_class_instance regions[2];
|
struct drm_i915_gem_create_ext create = {
|
||||||
uint32_t nregions = 0;
|
.size = bo_size,
|
||||||
switch (bo->real.heap) {
|
};
|
||||||
case IRIS_HEAP_DEVICE_LOCAL_PREFERRED:
|
|
||||||
/* For vram allocations, still use system memory as a fallback. */
|
|
||||||
regions[nregions++] = bufmgr->vram.region;
|
|
||||||
regions[nregions++] = bufmgr->sys.region;
|
|
||||||
break;
|
|
||||||
case IRIS_HEAP_DEVICE_LOCAL:
|
|
||||||
regions[nregions++] = bufmgr->vram.region;
|
|
||||||
break;
|
|
||||||
case IRIS_HEAP_SYSTEM_MEMORY:
|
|
||||||
regions[nregions++] = bufmgr->sys.region;
|
|
||||||
break;
|
|
||||||
case IRIS_HEAP_MAX:
|
|
||||||
unreachable("invalid heap for BO");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
struct drm_i915_gem_memory_class_instance regions[2];
|
||||||
struct drm_i915_gem_create_ext_memory_regions ext_regions = {
|
struct drm_i915_gem_create_ext_memory_regions ext_regions = {
|
||||||
.base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
|
.base = { .name = I915_GEM_CREATE_EXT_MEMORY_REGIONS },
|
||||||
.num_regions = nregions,
|
.num_regions = 0,
|
||||||
.regions = (uintptr_t)regions,
|
.regions = (uintptr_t)regions,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct drm_i915_gem_create_ext create = {
|
if (bufmgr->vram.size > 0) {
|
||||||
.size = bo_size,
|
switch (bo->real.heap) {
|
||||||
.extensions = (uintptr_t)&ext_regions,
|
case IRIS_HEAP_DEVICE_LOCAL_PREFERRED:
|
||||||
};
|
/* For vram allocations, still use system memory as a fallback. */
|
||||||
|
regions[ext_regions.num_regions++] = bufmgr->vram.region;
|
||||||
|
regions[ext_regions.num_regions++] = bufmgr->sys.region;
|
||||||
|
break;
|
||||||
|
case IRIS_HEAP_DEVICE_LOCAL:
|
||||||
|
regions[ext_regions.num_regions++] = bufmgr->vram.region;
|
||||||
|
break;
|
||||||
|
case IRIS_HEAP_SYSTEM_MEMORY:
|
||||||
|
regions[ext_regions.num_regions++] = bufmgr->sys.region;
|
||||||
|
break;
|
||||||
|
case IRIS_HEAP_MAX:
|
||||||
|
unreachable("invalid heap for BO");
|
||||||
|
}
|
||||||
|
|
||||||
if (!bufmgr->all_vram_mappable &&
|
intel_gem_add_ext(&create.extensions,
|
||||||
bo->real.heap == IRIS_HEAP_DEVICE_LOCAL_PREFERRED) {
|
I915_GEM_CREATE_EXT_MEMORY_REGIONS,
|
||||||
create.flags |= I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS;
|
&ext_regions.base);
|
||||||
|
|
||||||
|
if (!bufmgr->all_vram_mappable &&
|
||||||
|
bo->real.heap == IRIS_HEAP_DEVICE_LOCAL_PREFERRED) {
|
||||||
|
create.flags |= I915_GEM_CREATE_EXT_FLAG_NEEDS_CPU_ACCESS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Protected param */
|
||||||
|
struct drm_i915_gem_create_ext_protected_content protected_param = {
|
||||||
|
.flags = 0,
|
||||||
|
};
|
||||||
|
if (flags & BO_ALLOC_PROTECTED) {
|
||||||
|
intel_gem_add_ext(&create.extensions,
|
||||||
|
I915_GEM_CREATE_EXT_PROTECTED_CONTENT,
|
||||||
|
&protected_param.base);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* It should be safe to use GEM_CREATE_EXT without checking, since we are
|
/* It should be safe to use GEM_CREATE_EXT without checking, since we are
|
||||||
|
|
@ -1127,6 +1142,7 @@ iris_bo_alloc(struct iris_bufmgr *bufmgr,
|
||||||
bo->name = name;
|
bo->name = name;
|
||||||
p_atomic_set(&bo->refcount, 1);
|
p_atomic_set(&bo->refcount, 1);
|
||||||
bo->real.reusable = bucket && bufmgr->bo_reuse;
|
bo->real.reusable = bucket && bufmgr->bo_reuse;
|
||||||
|
bo->real.protected = flags & BO_ALLOC_PROTECTED;
|
||||||
bo->index = -1;
|
bo->index = -1;
|
||||||
bo->real.kflags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS | EXEC_OBJECT_PINNED;
|
bo->real.kflags = EXEC_OBJECT_SUPPORTS_48B_ADDRESS | EXEC_OBJECT_PINNED;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -285,6 +285,9 @@ struct iris_bo {
|
||||||
|
|
||||||
/** Boolean of whether this buffer points into user memory */
|
/** Boolean of whether this buffer points into user memory */
|
||||||
bool userptr;
|
bool userptr;
|
||||||
|
|
||||||
|
/** Boolean of whether this buffer is protected (HW encryption) */
|
||||||
|
bool protected;
|
||||||
} real;
|
} real;
|
||||||
struct {
|
struct {
|
||||||
struct pb_slab_entry entry;
|
struct pb_slab_entry entry;
|
||||||
|
|
@ -299,6 +302,7 @@ struct iris_bo {
|
||||||
#define BO_ALLOC_SCANOUT (1<<3)
|
#define BO_ALLOC_SCANOUT (1<<3)
|
||||||
#define BO_ALLOC_NO_SUBALLOC (1<<4)
|
#define BO_ALLOC_NO_SUBALLOC (1<<4)
|
||||||
#define BO_ALLOC_LMEM (1<<5)
|
#define BO_ALLOC_LMEM (1<<5)
|
||||||
|
#define BO_ALLOC_PROTECTED (1<<6)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allocate a buffer object.
|
* Allocate a buffer object.
|
||||||
|
|
|
||||||
|
|
@ -480,6 +480,9 @@ iris_resource_alloc_flags(const struct iris_screen *screen,
|
||||||
util_format_get_num_planes(templ->format) > 1)
|
util_format_get_num_planes(templ->format) > 1)
|
||||||
flags |= BO_ALLOC_NO_SUBALLOC;
|
flags |= BO_ALLOC_NO_SUBALLOC;
|
||||||
|
|
||||||
|
if (templ->bind & PIPE_BIND_PROTECTED)
|
||||||
|
flags |= BO_ALLOC_PROTECTED;
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1944,7 +1947,8 @@ iris_invalidate_resource(struct pipe_context *ctx,
|
||||||
struct iris_bo *new_bo =
|
struct iris_bo *new_bo =
|
||||||
iris_bo_alloc(screen->bufmgr, res->bo->name, resource->width0,
|
iris_bo_alloc(screen->bufmgr, res->bo->name, resource->width0,
|
||||||
iris_buffer_alignment(resource->width0),
|
iris_buffer_alignment(resource->width0),
|
||||||
iris_memzone_for_address(old_bo->address), 0);
|
iris_memzone_for_address(old_bo->address),
|
||||||
|
old_bo->real.protected ? BO_ALLOC_PROTECTED : 0);
|
||||||
if (!new_bo)
|
if (!new_bo)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -311,7 +311,10 @@ iris_mocs(const struct iris_bo *bo,
|
||||||
const struct isl_device *dev,
|
const struct isl_device *dev,
|
||||||
isl_surf_usage_flags_t usage)
|
isl_surf_usage_flags_t usage)
|
||||||
{
|
{
|
||||||
return isl_mocs(dev, usage, bo && iris_bo_is_external(bo));
|
return isl_mocs(dev,
|
||||||
|
usage |
|
||||||
|
((bo && bo->real.protected) ? ISL_SURF_USAGE_PROTECTED_BIT : 0),
|
||||||
|
bo && iris_bo_is_external(bo));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct iris_format_info iris_format_for_usage(const struct intel_device_info *,
|
struct iris_format_info iris_format_for_usage(const struct intel_device_info *,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue