1ad8b1aafSjsg /* SPDX-License-Identifier: MIT */ 2ad8b1aafSjsg /* 3ad8b1aafSjsg * Copyright © 2019 Intel Corporation 4ad8b1aafSjsg */ 5ad8b1aafSjsg 6ad8b1aafSjsg #ifndef __INTEL_BREADCRUMBS__ 7ad8b1aafSjsg #define __INTEL_BREADCRUMBS__ 8ad8b1aafSjsg 9*5ca02815Sjsg #include <linux/atomic.h> 10ad8b1aafSjsg #include <linux/irq_work.h> 11ad8b1aafSjsg 12*5ca02815Sjsg #include "intel_breadcrumbs_types.h" 13ad8b1aafSjsg 14ad8b1aafSjsg struct drm_printer; 15ad8b1aafSjsg struct i915_request; 16ad8b1aafSjsg struct intel_breadcrumbs; 17ad8b1aafSjsg 18ad8b1aafSjsg struct intel_breadcrumbs * 19ad8b1aafSjsg intel_breadcrumbs_create(struct intel_engine_cs *irq_engine); 20*5ca02815Sjsg void intel_breadcrumbs_free(struct kref *kref); 21ad8b1aafSjsg 22ad8b1aafSjsg void intel_breadcrumbs_reset(struct intel_breadcrumbs *b); 23*5ca02815Sjsg void __intel_breadcrumbs_park(struct intel_breadcrumbs *b); 24*5ca02815Sjsg intel_breadcrumbs_unpark(struct intel_breadcrumbs * b)25*5ca02815Sjsgstatic inline void intel_breadcrumbs_unpark(struct intel_breadcrumbs *b) 26*5ca02815Sjsg { 27*5ca02815Sjsg atomic_inc(&b->active); 28*5ca02815Sjsg } 29*5ca02815Sjsg intel_breadcrumbs_park(struct intel_breadcrumbs * b)30*5ca02815Sjsgstatic inline void intel_breadcrumbs_park(struct intel_breadcrumbs *b) 31*5ca02815Sjsg { 32*5ca02815Sjsg if (atomic_dec_and_test(&b->active)) 33*5ca02815Sjsg __intel_breadcrumbs_park(b); 34*5ca02815Sjsg } 35ad8b1aafSjsg 36ad8b1aafSjsg static inline void intel_engine_signal_breadcrumbs(struct intel_engine_cs * engine)37ad8b1aafSjsgintel_engine_signal_breadcrumbs(struct intel_engine_cs *engine) 38ad8b1aafSjsg { 39ad8b1aafSjsg irq_work_queue(&engine->breadcrumbs->irq_work); 40ad8b1aafSjsg } 41ad8b1aafSjsg 42ad8b1aafSjsg void intel_engine_print_breadcrumbs(struct intel_engine_cs *engine, 43ad8b1aafSjsg struct drm_printer *p); 44ad8b1aafSjsg 45ad8b1aafSjsg bool i915_request_enable_breadcrumb(struct i915_request *request); 46ad8b1aafSjsg void i915_request_cancel_breadcrumb(struct i915_request *request); 47ad8b1aafSjsg 48*5ca02815Sjsg void intel_context_remove_breadcrumbs(struct intel_context *ce, 49*5ca02815Sjsg struct intel_breadcrumbs *b); 50*5ca02815Sjsg 51*5ca02815Sjsg static inline struct intel_breadcrumbs * intel_breadcrumbs_get(struct intel_breadcrumbs * b)52*5ca02815Sjsgintel_breadcrumbs_get(struct intel_breadcrumbs *b) 53*5ca02815Sjsg { 54*5ca02815Sjsg kref_get(&b->ref); 55*5ca02815Sjsg return b; 56*5ca02815Sjsg } 57*5ca02815Sjsg intel_breadcrumbs_put(struct intel_breadcrumbs * b)58*5ca02815Sjsgstatic inline void intel_breadcrumbs_put(struct intel_breadcrumbs *b) 59*5ca02815Sjsg { 60*5ca02815Sjsg kref_put(&b->ref, intel_breadcrumbs_free); 61*5ca02815Sjsg } 62*5ca02815Sjsg 63ad8b1aafSjsg #endif /* __INTEL_BREADCRUMBS__ */ 64