1 /* SPDX-License-Identifier: MIT */ 2 /* 3 * Copyright © 2020 Intel Corporation 4 */ 5 6 #ifndef __I915_DRM_CLIENT_H__ 7 #define __I915_DRM_CLIENT_H__ 8 9 #include <linux/kref.h> 10 #include <linux/list.h> 11 #include <linux/spinlock.h> 12 #include <linux/xarray.h> 13 14 #include <uapi/drm/i915_drm.h> 15 16 #define I915_LAST_UABI_ENGINE_CLASS I915_ENGINE_CLASS_COMPUTE 17 18 struct drm_i915_private; 19 20 struct i915_drm_clients { 21 struct drm_i915_private *i915; 22 23 struct xarray xarray; 24 u32 next_id; 25 }; 26 27 struct i915_drm_client { 28 struct kref kref; 29 30 unsigned int id; 31 32 spinlock_t ctx_lock; /* For add/remove from ctx_list. */ 33 struct list_head ctx_list; /* List of contexts belonging to client. */ 34 35 struct i915_drm_clients *clients; 36 37 /** 38 * @past_runtime: Accumulation of pphwsp runtimes from closed contexts. 39 */ 40 atomic64_t past_runtime[I915_LAST_UABI_ENGINE_CLASS + 1]; 41 }; 42 43 void i915_drm_clients_init(struct i915_drm_clients *clients, 44 struct drm_i915_private *i915); 45 46 static inline struct i915_drm_client * 47 i915_drm_client_get(struct i915_drm_client *client) 48 { 49 kref_get(&client->kref); 50 return client; 51 } 52 53 void __i915_drm_client_free(struct kref *kref); 54 55 static inline void i915_drm_client_put(struct i915_drm_client *client) 56 { 57 kref_put(&client->kref, __i915_drm_client_free); 58 } 59 60 struct i915_drm_client *i915_drm_client_add(struct i915_drm_clients *clients); 61 62 #ifdef CONFIG_PROC_FS 63 void i915_drm_client_fdinfo(struct seq_file *m, struct file *f); 64 #endif 65 66 void i915_drm_clients_fini(struct i915_drm_clients *clients); 67 68 #endif /* !__I915_DRM_CLIENT_H__ */ 69