hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*
 * SPDX-License-Identifier: MIT
 *
 * Copyright © 2019 Intel Corporation
 */
 
#ifndef __INTEL_CONTEXT_TYPES__
#define __INTEL_CONTEXT_TYPES__
 
#include <linux/average.h>
#include <linux/kref.h>
#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/types.h>
 
#include "i915_active_types.h"
#include "i915_utils.h"
#include "intel_engine_types.h"
#include "intel_sseu.h"
 
#define CONTEXT_REDZONE POISON_INUSE
 
DECLARE_EWMA(runtime, 3, 8);
 
struct i915_gem_context;
struct i915_gem_ww_ctx;
struct i915_vma;
struct intel_breadcrumbs;
struct intel_context;
struct intel_ring;
 
struct intel_context_ops {
   int (*alloc)(struct intel_context *ce);
 
   int (*pre_pin)(struct intel_context *ce, struct i915_gem_ww_ctx *ww, void **vaddr);
   int (*pin)(struct intel_context *ce, void *vaddr);
   void (*unpin)(struct intel_context *ce);
   void (*post_unpin)(struct intel_context *ce);
 
   void (*enter)(struct intel_context *ce);
   void (*exit)(struct intel_context *ce);
 
   void (*reset)(struct intel_context *ce);
   void (*destroy)(struct kref *kref);
};
 
struct intel_context {
   /*
    * Note: Some fields may be accessed under RCU.
    *
    * Unless otherwise noted a field can safely be assumed to be protected
    * by strong reference counting.
    */
   union {
       struct kref ref; /* no kref_get_unless_zero()! */
       struct rcu_head rcu;
   };
 
   struct intel_engine_cs *engine;
   struct intel_engine_cs *inflight;
#define intel_context_inflight(ce) ptr_mask_bits(READ_ONCE((ce)->inflight), 2)
#define intel_context_inflight_count(ce) ptr_unmask_bits(READ_ONCE((ce)->inflight), 2)
 
   struct i915_address_space *vm;
   struct i915_gem_context __rcu *gem_context;
 
   /*
    * @signal_lock protects the list of requests that need signaling,
    * @signals. While there are any requests that need signaling,
    * we add the context to the breadcrumbs worker, and remove it
    * upon completion/cancellation of the last request.
    */
   struct list_head signal_link; /* Accessed under RCU */
   struct list_head signals; /* Guarded by signal_lock */
   spinlock_t signal_lock; /* protects signals, the list of requests */
 
   struct i915_vma *state;
   struct intel_ring *ring;
   struct intel_timeline *timeline;
 
   unsigned long flags;
#define CONTEXT_BARRIER_BIT        0
#define CONTEXT_ALLOC_BIT        1
#define CONTEXT_VALID_BIT        2
#define CONTEXT_CLOSED_BIT        3
#define CONTEXT_USE_SEMAPHORES        4
#define CONTEXT_BANNED            5
#define CONTEXT_FORCE_SINGLE_SUBMISSION    6
#define CONTEXT_NOPREEMPT        7
 
   u32 *lrc_reg_state;
   union {
       struct {
           u32 lrca;
           u32 ccid;
       };
       u64 desc;
   } lrc;
   u32 tag; /* cookie passed to HW to track this context on submission */
 
   /* Time on GPU as tracked by the hw. */
   struct {
       struct ewma_runtime avg;
       u64 total;
       u32 last;
       I915_SELFTEST_DECLARE(u32 num_underflow);
       I915_SELFTEST_DECLARE(u32 max_underflow);
   } runtime;
 
   unsigned int active_count; /* protected by timeline->mutex */
 
   atomic_t pin_count;
   struct mutex pin_mutex; /* guards pinning and associated on-gpuing */
 
   /**
    * active: Active tracker for the rq activity (inc. external) on this
    * intel_context object.
    */
   struct i915_active active;
 
   const struct intel_context_ops *ops;
 
   /** sseu: Control eu/slice partitioning */
   struct intel_sseu sseu;
 
   u8 wa_bb_page; /* if set, page num reserved for context workarounds */
};
 
#endif /* __INTEL_CONTEXT_TYPES__ */