| /* SPDX-License-Identifier: MIT */ |
| /* |
| * Copyright © 2016 Intel Corporation |
| */ |
| |
| #ifndef __I915_TIMELINE_TYPES_H__ |
| #define __I915_TIMELINE_TYPES_H__ |
| |
| #include <linux/list.h> |
| #include <linux/kref.h> |
| #include <linux/mutex.h> |
| #include <linux/rcupdate.h> |
| #include <linux/types.h> |
| |
| #include "i915_active_types.h" |
| |
| struct i915_vma; |
| struct i915_syncmap; |
| struct intel_gt; |
| |
| struct intel_timeline { |
| u64 fence_context; |
| u32 seqno; |
| |
| struct mutex mutex; /* protects the flow of requests */ |
| |
| /* |
| * pin_count and active_count track essentially the same thing: |
| * How many requests are in flight or may be under construction. |
| * |
| * We need two distinct counters so that we can assign different |
| * lifetimes to the events for different use-cases. For example, |
| * we want to permanently keep the timeline pinned for the kernel |
| * context so that we can issue requests at any time without having |
| * to acquire space in the GGTT. However, we want to keep tracking |
| * the activity (to be able to detect when we become idle) along that |
| * permanently pinned timeline and so end up requiring two counters. |
| * |
| * Note that the active_count is protected by the intel_timeline.mutex, |
| * but the pin_count is protected by a combination of serialisation |
| * from the intel_context caller plus internal atomicity. |
| */ |
| atomic_t pin_count; |
| atomic_t active_count; |
| |
| void *hwsp_map; |
| const u32 *hwsp_seqno; |
| struct i915_vma *hwsp_ggtt; |
| u32 hwsp_offset; |
| |
| bool has_initial_breadcrumb; |
| |
| /** |
| * List of breadcrumbs associated with GPU requests currently |
| * outstanding. |
| */ |
| struct list_head requests; |
| |
| /* |
| * Contains an RCU guarded pointer to the last request. No reference is |
| * held to the request, users must carefully acquire a reference to |
| * the request using i915_active_fence_get(), or manage the RCU |
| * protection themselves (cf the i915_active_fence API). |
| */ |
| struct i915_active_fence last_request; |
| |
| struct i915_active active; |
| |
| /** A chain of completed timelines ready for early retirement. */ |
| struct intel_timeline *retire; |
| |
| /** |
| * We track the most recent seqno that we wait on in every context so |
| * that we only have to emit a new await and dependency on a more |
| * recent sync point. As the contexts may be executed out-of-order, we |
| * have to track each individually and can not rely on an absolute |
| * global_seqno. When we know that all tracked fences are completed |
| * (i.e. when the driver is idle), we know that the syncmap is |
| * redundant and we can discard it without loss of generality. |
| */ |
| struct i915_syncmap *sync; |
| |
| struct list_head link; |
| struct intel_gt *gt; |
| |
| struct list_head engine_link; |
| |
| struct kref kref; |
| struct rcu_head rcu; |
| }; |
| |
| #endif /* __I915_TIMELINE_TYPES_H__ */ |