2019-02-05 13:00:02 +00:00
|
|
|
/*
|
|
|
|
* SPDX-License-Identifier: MIT
|
|
|
|
*
|
|
|
|
* Copyright © 2019 Intel Corporation
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _I915_ACTIVE_H_
|
|
|
|
#define _I915_ACTIVE_H_
|
|
|
|
|
|
|
|
#include "i915_active_types.h"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* GPU activity tracking
|
|
|
|
*
|
|
|
|
* Each set of commands submitted to the GPU compromises a single request that
|
|
|
|
* signals a fence upon completion. struct i915_request combines the
|
|
|
|
* command submission, scheduling and fence signaling roles. If we want to see
|
|
|
|
* if a particular task is complete, we need to grab the fence (struct
|
|
|
|
* i915_request) for that task and check or wait for it to be signaled. More
|
|
|
|
* often though we want to track the status of a bunch of tasks, for example
|
|
|
|
* to wait for the GPU to finish accessing some memory across a variety of
|
|
|
|
* different command pipelines from different clients. We could choose to
|
|
|
|
* track every single request associated with the task, but knowing that
|
|
|
|
* each request belongs to an ordered timeline (later requests within a
|
|
|
|
* timeline must wait for earlier requests), we need only track the
|
|
|
|
* latest request in each timeline to determine the overall status of the
|
|
|
|
* task.
|
|
|
|
*
|
|
|
|
* struct i915_active provides this tracking across timelines. It builds a
|
|
|
|
* composite shared-fence, and is updated as new work is submitted to the task,
|
|
|
|
* forming a snapshot of the current status. It should be embedded into the
|
|
|
|
* different resources that need to track their associated GPU activity to
|
|
|
|
* provide a callback when that GPU activity has ceased, or otherwise to
|
|
|
|
* provide a serialisation point either for request submission or for CPU
|
|
|
|
* synchronisation.
|
|
|
|
*/
|
|
|
|
|
|
|
|
void i915_active_init(struct drm_i915_private *i915,
|
|
|
|
struct i915_active *ref,
|
|
|
|
void (*retire)(struct i915_active *ref));
|
|
|
|
|
|
|
|
int i915_active_ref(struct i915_active *ref,
|
|
|
|
u64 timeline,
|
|
|
|
struct i915_request *rq);
|
|
|
|
|
|
|
|
int i915_active_wait(struct i915_active *ref);
|
|
|
|
|
|
|
|
int i915_request_await_active(struct i915_request *rq,
|
|
|
|
struct i915_active *ref);
|
|
|
|
|
|
|
|
bool i915_active_acquire(struct i915_active *ref);
|
|
|
|
|
|
|
|
static inline void i915_active_cancel(struct i915_active *ref)
|
|
|
|
{
|
|
|
|
GEM_BUG_ON(ref->count != 1);
|
|
|
|
ref->count = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
void i915_active_release(struct i915_active *ref);
|
|
|
|
|
|
|
|
static inline bool
|
|
|
|
i915_active_is_idle(const struct i915_active *ref)
|
|
|
|
{
|
|
|
|
return !ref->count;
|
|
|
|
}
|
|
|
|
|
2019-02-05 13:00:03 +00:00
|
|
|
#if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
|
2019-02-05 13:00:02 +00:00
|
|
|
void i915_active_fini(struct i915_active *ref);
|
2019-02-05 13:00:03 +00:00
|
|
|
#else
|
|
|
|
static inline void i915_active_fini(struct i915_active *ref) { }
|
|
|
|
#endif
|
2019-02-05 13:00:02 +00:00
|
|
|
|
2019-02-05 13:00:04 +00:00
|
|
|
int i915_global_active_init(void);
|
|
|
|
void i915_global_active_exit(void);
|
|
|
|
|
2019-02-05 13:00:02 +00:00
|
|
|
#endif /* _I915_ACTIVE_H_ */
|