mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-25 22:20:52 +00:00
In preparation for an ever growing number of engines and so ever increasing static array of HW contexts within the GEM context, move the array over to an rbtree, allocated upon first use. Unfortunately, this imposes an rbtree lookup at a few frequent callsites, but we should be able to mitigate those by moving over to using the HW context as our primary type and so only incur the lookup on the boundary with the user GEM context and engines. v2: Check for no HW context in guc_stage_desc_init Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20190308132522.21573-4-chris@chris-wilson.co.uk
74 lines
1.9 KiB
C
74 lines
1.9 KiB
C
/*
|
|
* SPDX-License-Identifier: MIT
|
|
*
|
|
* Copyright © 2019 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __INTEL_CONTEXT_H__
|
|
#define __INTEL_CONTEXT_H__
|
|
|
|
#include "intel_context_types.h"
|
|
#include "intel_engine_types.h"
|
|
|
|
struct intel_context *intel_context_alloc(void);
|
|
void intel_context_free(struct intel_context *ce);
|
|
|
|
void intel_context_init(struct intel_context *ce,
|
|
struct i915_gem_context *ctx,
|
|
struct intel_engine_cs *engine);
|
|
|
|
/**
|
|
* intel_context_lookup - Find the matching HW context for this (ctx, engine)
|
|
* @ctx - the parent GEM context
|
|
* @engine - the target HW engine
|
|
*
|
|
* May return NULL if the HW context hasn't been instantiated (i.e. unused).
|
|
*/
|
|
struct intel_context *
|
|
intel_context_lookup(struct i915_gem_context *ctx,
|
|
struct intel_engine_cs *engine);
|
|
|
|
/**
|
|
* intel_context_instance - Lookup or allocate the HW context for (ctx, engine)
|
|
* @ctx - the parent GEM context
|
|
* @engine - the target HW engine
|
|
*
|
|
* Returns the existing HW context for this pair of (GEM context, engine), or
|
|
* allocates and initialises a fresh context. Once allocated, the HW context
|
|
* remains resident until the GEM context is destroyed.
|
|
*/
|
|
struct intel_context *
|
|
intel_context_instance(struct i915_gem_context *ctx,
|
|
struct intel_engine_cs *engine);
|
|
|
|
struct intel_context *
|
|
__intel_context_insert(struct i915_gem_context *ctx,
|
|
struct intel_engine_cs *engine,
|
|
struct intel_context *ce);
|
|
void
|
|
__intel_context_remove(struct intel_context *ce);
|
|
|
|
static inline struct intel_context *
|
|
intel_context_pin(struct i915_gem_context *ctx, struct intel_engine_cs *engine)
|
|
{
|
|
return engine->context_pin(engine, ctx);
|
|
}
|
|
|
|
static inline void __intel_context_pin(struct intel_context *ce)
|
|
{
|
|
GEM_BUG_ON(!ce->pin_count);
|
|
ce->pin_count++;
|
|
}
|
|
|
|
static inline void intel_context_unpin(struct intel_context *ce)
|
|
{
|
|
GEM_BUG_ON(!ce->pin_count);
|
|
if (--ce->pin_count)
|
|
return;
|
|
|
|
GEM_BUG_ON(!ce->ops);
|
|
ce->ops->unpin(ce);
|
|
}
|
|
|
|
#endif /* __INTEL_CONTEXT_H__ */
|