1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun * Copyright © 2016 Intel Corporation
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"),
6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation
7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the
9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the next
12*4882a593Smuzhiyun * paragraph) shall be included in all copies or substantial portions of the
13*4882a593Smuzhiyun * Software.
14*4882a593Smuzhiyun *
15*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*4882a593Smuzhiyun * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*4882a593Smuzhiyun * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*4882a593Smuzhiyun * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*4882a593Smuzhiyun * IN THE SOFTWARE.
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun */
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun #include "gem/i915_gem_context.h"
26*4882a593Smuzhiyun #include "gt/intel_ring.h"
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun #include "i915_drv.h"
29*4882a593Smuzhiyun #include "intel_context.h"
30*4882a593Smuzhiyun #include "intel_engine_pm.h"
31*4882a593Smuzhiyun
32*4882a593Smuzhiyun #include "mock_engine.h"
33*4882a593Smuzhiyun #include "selftests/mock_request.h"
34*4882a593Smuzhiyun
mock_timeline_pin(struct intel_timeline * tl)35*4882a593Smuzhiyun static void mock_timeline_pin(struct intel_timeline *tl)
36*4882a593Smuzhiyun {
37*4882a593Smuzhiyun atomic_inc(&tl->pin_count);
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
mock_timeline_unpin(struct intel_timeline * tl)40*4882a593Smuzhiyun static void mock_timeline_unpin(struct intel_timeline *tl)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun GEM_BUG_ON(!atomic_read(&tl->pin_count));
43*4882a593Smuzhiyun atomic_dec(&tl->pin_count);
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
mock_ring(struct intel_engine_cs * engine)46*4882a593Smuzhiyun static struct intel_ring *mock_ring(struct intel_engine_cs *engine)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun const unsigned long sz = PAGE_SIZE / 2;
49*4882a593Smuzhiyun struct intel_ring *ring;
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun ring = kzalloc(sizeof(*ring) + sz, GFP_KERNEL);
52*4882a593Smuzhiyun if (!ring)
53*4882a593Smuzhiyun return NULL;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun kref_init(&ring->ref);
56*4882a593Smuzhiyun ring->size = sz;
57*4882a593Smuzhiyun ring->effective_size = sz;
58*4882a593Smuzhiyun ring->vaddr = (void *)(ring + 1);
59*4882a593Smuzhiyun atomic_set(&ring->pin_count, 1);
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun ring->vma = i915_vma_alloc();
62*4882a593Smuzhiyun if (!ring->vma) {
63*4882a593Smuzhiyun kfree(ring);
64*4882a593Smuzhiyun return NULL;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun i915_active_init(&ring->vma->active, NULL, NULL);
67*4882a593Smuzhiyun __set_bit(I915_VMA_GGTT_BIT, __i915_vma_flags(ring->vma));
68*4882a593Smuzhiyun __set_bit(DRM_MM_NODE_ALLOCATED_BIT, &ring->vma->node.flags);
69*4882a593Smuzhiyun ring->vma->node.size = sz;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun intel_ring_update_space(ring);
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun return ring;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
mock_ring_free(struct intel_ring * ring)76*4882a593Smuzhiyun static void mock_ring_free(struct intel_ring *ring)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun i915_active_fini(&ring->vma->active);
79*4882a593Smuzhiyun i915_vma_free(ring->vma);
80*4882a593Smuzhiyun
81*4882a593Smuzhiyun kfree(ring);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun
first_request(struct mock_engine * engine)84*4882a593Smuzhiyun static struct i915_request *first_request(struct mock_engine *engine)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun return list_first_entry_or_null(&engine->hw_queue,
87*4882a593Smuzhiyun struct i915_request,
88*4882a593Smuzhiyun mock.link);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun
advance(struct i915_request * request)91*4882a593Smuzhiyun static void advance(struct i915_request *request)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun list_del_init(&request->mock.link);
94*4882a593Smuzhiyun i915_request_mark_complete(request);
95*4882a593Smuzhiyun GEM_BUG_ON(!i915_request_completed(request));
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun intel_engine_signal_breadcrumbs(request->engine);
98*4882a593Smuzhiyun }
99*4882a593Smuzhiyun
hw_delay_complete(struct timer_list * t)100*4882a593Smuzhiyun static void hw_delay_complete(struct timer_list *t)
101*4882a593Smuzhiyun {
102*4882a593Smuzhiyun struct mock_engine *engine = from_timer(engine, t, hw_delay);
103*4882a593Smuzhiyun struct i915_request *request;
104*4882a593Smuzhiyun unsigned long flags;
105*4882a593Smuzhiyun
106*4882a593Smuzhiyun spin_lock_irqsave(&engine->hw_lock, flags);
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun /* Timer fired, first request is complete */
109*4882a593Smuzhiyun request = first_request(engine);
110*4882a593Smuzhiyun if (request)
111*4882a593Smuzhiyun advance(request);
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun /*
114*4882a593Smuzhiyun * Also immediately signal any subsequent 0-delay requests, but
115*4882a593Smuzhiyun * requeue the timer for the next delayed request.
116*4882a593Smuzhiyun */
117*4882a593Smuzhiyun while ((request = first_request(engine))) {
118*4882a593Smuzhiyun if (request->mock.delay) {
119*4882a593Smuzhiyun mod_timer(&engine->hw_delay,
120*4882a593Smuzhiyun jiffies + request->mock.delay);
121*4882a593Smuzhiyun break;
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun advance(request);
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun spin_unlock_irqrestore(&engine->hw_lock, flags);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun
mock_context_unpin(struct intel_context * ce)130*4882a593Smuzhiyun static void mock_context_unpin(struct intel_context *ce)
131*4882a593Smuzhiyun {
132*4882a593Smuzhiyun }
133*4882a593Smuzhiyun
mock_context_post_unpin(struct intel_context * ce)134*4882a593Smuzhiyun static void mock_context_post_unpin(struct intel_context *ce)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun }
137*4882a593Smuzhiyun
mock_context_destroy(struct kref * ref)138*4882a593Smuzhiyun static void mock_context_destroy(struct kref *ref)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun struct intel_context *ce = container_of(ref, typeof(*ce), ref);
141*4882a593Smuzhiyun
142*4882a593Smuzhiyun GEM_BUG_ON(intel_context_is_pinned(ce));
143*4882a593Smuzhiyun
144*4882a593Smuzhiyun if (test_bit(CONTEXT_ALLOC_BIT, &ce->flags)) {
145*4882a593Smuzhiyun mock_ring_free(ce->ring);
146*4882a593Smuzhiyun mock_timeline_unpin(ce->timeline);
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun intel_context_fini(ce);
150*4882a593Smuzhiyun intel_context_free(ce);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun
mock_context_alloc(struct intel_context * ce)153*4882a593Smuzhiyun static int mock_context_alloc(struct intel_context *ce)
154*4882a593Smuzhiyun {
155*4882a593Smuzhiyun ce->ring = mock_ring(ce->engine);
156*4882a593Smuzhiyun if (!ce->ring)
157*4882a593Smuzhiyun return -ENOMEM;
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun ce->timeline = intel_timeline_create(ce->engine->gt);
160*4882a593Smuzhiyun if (IS_ERR(ce->timeline)) {
161*4882a593Smuzhiyun kfree(ce->engine);
162*4882a593Smuzhiyun return PTR_ERR(ce->timeline);
163*4882a593Smuzhiyun }
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun mock_timeline_pin(ce->timeline);
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun return 0;
168*4882a593Smuzhiyun }
169*4882a593Smuzhiyun
mock_context_pre_pin(struct intel_context * ce,struct i915_gem_ww_ctx * ww,void ** unused)170*4882a593Smuzhiyun static int mock_context_pre_pin(struct intel_context *ce,
171*4882a593Smuzhiyun struct i915_gem_ww_ctx *ww, void **unused)
172*4882a593Smuzhiyun {
173*4882a593Smuzhiyun return 0;
174*4882a593Smuzhiyun }
175*4882a593Smuzhiyun
mock_context_pin(struct intel_context * ce,void * unused)176*4882a593Smuzhiyun static int mock_context_pin(struct intel_context *ce, void *unused)
177*4882a593Smuzhiyun {
178*4882a593Smuzhiyun return 0;
179*4882a593Smuzhiyun }
180*4882a593Smuzhiyun
mock_context_reset(struct intel_context * ce)181*4882a593Smuzhiyun static void mock_context_reset(struct intel_context *ce)
182*4882a593Smuzhiyun {
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun static const struct intel_context_ops mock_context_ops = {
186*4882a593Smuzhiyun .alloc = mock_context_alloc,
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun .pre_pin = mock_context_pre_pin,
189*4882a593Smuzhiyun .pin = mock_context_pin,
190*4882a593Smuzhiyun .unpin = mock_context_unpin,
191*4882a593Smuzhiyun .post_unpin = mock_context_post_unpin,
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun .enter = intel_context_enter_engine,
194*4882a593Smuzhiyun .exit = intel_context_exit_engine,
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun .reset = mock_context_reset,
197*4882a593Smuzhiyun .destroy = mock_context_destroy,
198*4882a593Smuzhiyun };
199*4882a593Smuzhiyun
mock_request_alloc(struct i915_request * request)200*4882a593Smuzhiyun static int mock_request_alloc(struct i915_request *request)
201*4882a593Smuzhiyun {
202*4882a593Smuzhiyun INIT_LIST_HEAD(&request->mock.link);
203*4882a593Smuzhiyun request->mock.delay = 0;
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun return 0;
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
mock_emit_flush(struct i915_request * request,unsigned int flags)208*4882a593Smuzhiyun static int mock_emit_flush(struct i915_request *request,
209*4882a593Smuzhiyun unsigned int flags)
210*4882a593Smuzhiyun {
211*4882a593Smuzhiyun return 0;
212*4882a593Smuzhiyun }
213*4882a593Smuzhiyun
mock_emit_breadcrumb(struct i915_request * request,u32 * cs)214*4882a593Smuzhiyun static u32 *mock_emit_breadcrumb(struct i915_request *request, u32 *cs)
215*4882a593Smuzhiyun {
216*4882a593Smuzhiyun return cs;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
mock_submit_request(struct i915_request * request)219*4882a593Smuzhiyun static void mock_submit_request(struct i915_request *request)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun struct mock_engine *engine =
222*4882a593Smuzhiyun container_of(request->engine, typeof(*engine), base);
223*4882a593Smuzhiyun unsigned long flags;
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun i915_request_submit(request);
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun spin_lock_irqsave(&engine->hw_lock, flags);
228*4882a593Smuzhiyun list_add_tail(&request->mock.link, &engine->hw_queue);
229*4882a593Smuzhiyun if (list_is_first(&request->mock.link, &engine->hw_queue)) {
230*4882a593Smuzhiyun if (request->mock.delay)
231*4882a593Smuzhiyun mod_timer(&engine->hw_delay,
232*4882a593Smuzhiyun jiffies + request->mock.delay);
233*4882a593Smuzhiyun else
234*4882a593Smuzhiyun advance(request);
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun spin_unlock_irqrestore(&engine->hw_lock, flags);
237*4882a593Smuzhiyun }
238*4882a593Smuzhiyun
mock_reset_prepare(struct intel_engine_cs * engine)239*4882a593Smuzhiyun static void mock_reset_prepare(struct intel_engine_cs *engine)
240*4882a593Smuzhiyun {
241*4882a593Smuzhiyun }
242*4882a593Smuzhiyun
mock_reset_rewind(struct intel_engine_cs * engine,bool stalled)243*4882a593Smuzhiyun static void mock_reset_rewind(struct intel_engine_cs *engine, bool stalled)
244*4882a593Smuzhiyun {
245*4882a593Smuzhiyun GEM_BUG_ON(stalled);
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun
mock_reset_cancel(struct intel_engine_cs * engine)248*4882a593Smuzhiyun static void mock_reset_cancel(struct intel_engine_cs *engine)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun struct i915_request *request;
251*4882a593Smuzhiyun unsigned long flags;
252*4882a593Smuzhiyun
253*4882a593Smuzhiyun spin_lock_irqsave(&engine->active.lock, flags);
254*4882a593Smuzhiyun
255*4882a593Smuzhiyun /* Mark all submitted requests as skipped. */
256*4882a593Smuzhiyun list_for_each_entry(request, &engine->active.requests, sched.link) {
257*4882a593Smuzhiyun i915_request_set_error_once(request, -EIO);
258*4882a593Smuzhiyun i915_request_mark_complete(request);
259*4882a593Smuzhiyun }
260*4882a593Smuzhiyun
261*4882a593Smuzhiyun spin_unlock_irqrestore(&engine->active.lock, flags);
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun
mock_reset_finish(struct intel_engine_cs * engine)264*4882a593Smuzhiyun static void mock_reset_finish(struct intel_engine_cs *engine)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun }
267*4882a593Smuzhiyun
mock_engine_release(struct intel_engine_cs * engine)268*4882a593Smuzhiyun static void mock_engine_release(struct intel_engine_cs *engine)
269*4882a593Smuzhiyun {
270*4882a593Smuzhiyun struct mock_engine *mock =
271*4882a593Smuzhiyun container_of(engine, typeof(*mock), base);
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun GEM_BUG_ON(timer_pending(&mock->hw_delay));
274*4882a593Smuzhiyun
275*4882a593Smuzhiyun intel_breadcrumbs_free(engine->breadcrumbs);
276*4882a593Smuzhiyun
277*4882a593Smuzhiyun intel_context_unpin(engine->kernel_context);
278*4882a593Smuzhiyun intel_context_put(engine->kernel_context);
279*4882a593Smuzhiyun
280*4882a593Smuzhiyun intel_engine_fini_retire(engine);
281*4882a593Smuzhiyun }
282*4882a593Smuzhiyun
mock_engine(struct drm_i915_private * i915,const char * name,int id)283*4882a593Smuzhiyun struct intel_engine_cs *mock_engine(struct drm_i915_private *i915,
284*4882a593Smuzhiyun const char *name,
285*4882a593Smuzhiyun int id)
286*4882a593Smuzhiyun {
287*4882a593Smuzhiyun struct mock_engine *engine;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun GEM_BUG_ON(id >= I915_NUM_ENGINES);
290*4882a593Smuzhiyun GEM_BUG_ON(!i915->gt.uncore);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun engine = kzalloc(sizeof(*engine) + PAGE_SIZE, GFP_KERNEL);
293*4882a593Smuzhiyun if (!engine)
294*4882a593Smuzhiyun return NULL;
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun /* minimal engine setup for requests */
297*4882a593Smuzhiyun engine->base.i915 = i915;
298*4882a593Smuzhiyun engine->base.gt = &i915->gt;
299*4882a593Smuzhiyun engine->base.uncore = i915->gt.uncore;
300*4882a593Smuzhiyun snprintf(engine->base.name, sizeof(engine->base.name), "%s", name);
301*4882a593Smuzhiyun engine->base.id = id;
302*4882a593Smuzhiyun engine->base.mask = BIT(id);
303*4882a593Smuzhiyun engine->base.legacy_idx = INVALID_ENGINE;
304*4882a593Smuzhiyun engine->base.instance = id;
305*4882a593Smuzhiyun engine->base.status_page.addr = (void *)(engine + 1);
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun engine->base.cops = &mock_context_ops;
308*4882a593Smuzhiyun engine->base.request_alloc = mock_request_alloc;
309*4882a593Smuzhiyun engine->base.emit_flush = mock_emit_flush;
310*4882a593Smuzhiyun engine->base.emit_fini_breadcrumb = mock_emit_breadcrumb;
311*4882a593Smuzhiyun engine->base.submit_request = mock_submit_request;
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun engine->base.reset.prepare = mock_reset_prepare;
314*4882a593Smuzhiyun engine->base.reset.rewind = mock_reset_rewind;
315*4882a593Smuzhiyun engine->base.reset.cancel = mock_reset_cancel;
316*4882a593Smuzhiyun engine->base.reset.finish = mock_reset_finish;
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun engine->base.release = mock_engine_release;
319*4882a593Smuzhiyun
320*4882a593Smuzhiyun i915->gt.engine[id] = &engine->base;
321*4882a593Smuzhiyun i915->gt.engine_class[0][id] = &engine->base;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun /* fake hw queue */
324*4882a593Smuzhiyun spin_lock_init(&engine->hw_lock);
325*4882a593Smuzhiyun timer_setup(&engine->hw_delay, hw_delay_complete, 0);
326*4882a593Smuzhiyun INIT_LIST_HEAD(&engine->hw_queue);
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun intel_engine_add_user(&engine->base);
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun return &engine->base;
331*4882a593Smuzhiyun }
332*4882a593Smuzhiyun
mock_engine_init(struct intel_engine_cs * engine)333*4882a593Smuzhiyun int mock_engine_init(struct intel_engine_cs *engine)
334*4882a593Smuzhiyun {
335*4882a593Smuzhiyun struct intel_context *ce;
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun intel_engine_init_active(engine, ENGINE_MOCK);
338*4882a593Smuzhiyun intel_engine_init_execlists(engine);
339*4882a593Smuzhiyun intel_engine_init__pm(engine);
340*4882a593Smuzhiyun intel_engine_init_retire(engine);
341*4882a593Smuzhiyun
342*4882a593Smuzhiyun engine->breadcrumbs = intel_breadcrumbs_create(NULL);
343*4882a593Smuzhiyun if (!engine->breadcrumbs)
344*4882a593Smuzhiyun return -ENOMEM;
345*4882a593Smuzhiyun
346*4882a593Smuzhiyun ce = create_kernel_context(engine);
347*4882a593Smuzhiyun if (IS_ERR(ce))
348*4882a593Smuzhiyun goto err_breadcrumbs;
349*4882a593Smuzhiyun
350*4882a593Smuzhiyun /* We insist the kernel context is using the status_page */
351*4882a593Smuzhiyun engine->status_page.vma = ce->timeline->hwsp_ggtt;
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun engine->kernel_context = ce;
354*4882a593Smuzhiyun return 0;
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun err_breadcrumbs:
357*4882a593Smuzhiyun intel_breadcrumbs_free(engine->breadcrumbs);
358*4882a593Smuzhiyun return -ENOMEM;
359*4882a593Smuzhiyun }
360*4882a593Smuzhiyun
mock_engine_flush(struct intel_engine_cs * engine)361*4882a593Smuzhiyun void mock_engine_flush(struct intel_engine_cs *engine)
362*4882a593Smuzhiyun {
363*4882a593Smuzhiyun struct mock_engine *mock =
364*4882a593Smuzhiyun container_of(engine, typeof(*mock), base);
365*4882a593Smuzhiyun struct i915_request *request, *rn;
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun del_timer_sync(&mock->hw_delay);
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun spin_lock_irq(&mock->hw_lock);
370*4882a593Smuzhiyun list_for_each_entry_safe(request, rn, &mock->hw_queue, mock.link)
371*4882a593Smuzhiyun advance(request);
372*4882a593Smuzhiyun spin_unlock_irq(&mock->hw_lock);
373*4882a593Smuzhiyun }
374*4882a593Smuzhiyun
mock_engine_reset(struct intel_engine_cs * engine)375*4882a593Smuzhiyun void mock_engine_reset(struct intel_engine_cs *engine)
376*4882a593Smuzhiyun {
377*4882a593Smuzhiyun }
378