162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright © 2020 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __I915_DRM_CLIENT_H__
762306a36Sopenharmony_ci#define __I915_DRM_CLIENT_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/kref.h>
1062306a36Sopenharmony_ci#include <linux/list.h>
1162306a36Sopenharmony_ci#include <linux/spinlock.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include <uapi/drm/i915_drm.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define I915_LAST_UABI_ENGINE_CLASS I915_ENGINE_CLASS_COMPUTE
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistruct drm_file;
1862306a36Sopenharmony_cistruct drm_printer;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_cistruct i915_drm_client {
2162306a36Sopenharmony_ci	struct kref kref;
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	unsigned int id;
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci	spinlock_t ctx_lock; /* For add/remove from ctx_list. */
2662306a36Sopenharmony_ci	struct list_head ctx_list; /* List of contexts belonging to client. */
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci	/**
2962306a36Sopenharmony_ci	 * @past_runtime: Accumulation of pphwsp runtimes from closed contexts.
3062306a36Sopenharmony_ci	 */
3162306a36Sopenharmony_ci	atomic64_t past_runtime[I915_LAST_UABI_ENGINE_CLASS + 1];
3262306a36Sopenharmony_ci};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic inline struct i915_drm_client *
3562306a36Sopenharmony_cii915_drm_client_get(struct i915_drm_client *client)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	kref_get(&client->kref);
3862306a36Sopenharmony_ci	return client;
3962306a36Sopenharmony_ci}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_civoid __i915_drm_client_free(struct kref *kref);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic inline void i915_drm_client_put(struct i915_drm_client *client)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	kref_put(&client->kref, __i915_drm_client_free);
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct i915_drm_client *i915_drm_client_alloc(void);
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_civoid i915_drm_client_fdinfo(struct drm_printer *p, struct drm_file *file);
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#endif /* !__I915_DRM_CLIENT_H__ */
53