162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright © 2019 Intel Corporation
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef __I915_PERF_H__
762306a36Sopenharmony_ci#define __I915_PERF_H__
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/kref.h>
1062306a36Sopenharmony_ci#include <linux/types.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include "i915_perf_types.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct drm_device;
1562306a36Sopenharmony_cistruct drm_file;
1662306a36Sopenharmony_cistruct drm_i915_private;
1762306a36Sopenharmony_cistruct i915_oa_config;
1862306a36Sopenharmony_cistruct intel_context;
1962306a36Sopenharmony_cistruct intel_engine_cs;
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ciint i915_perf_init(struct drm_i915_private *i915);
2262306a36Sopenharmony_civoid i915_perf_fini(struct drm_i915_private *i915);
2362306a36Sopenharmony_civoid i915_perf_register(struct drm_i915_private *i915);
2462306a36Sopenharmony_civoid i915_perf_unregister(struct drm_i915_private *i915);
2562306a36Sopenharmony_ciint i915_perf_ioctl_version(struct drm_i915_private *i915);
2662306a36Sopenharmony_ciint i915_perf_sysctl_register(void);
2762306a36Sopenharmony_civoid i915_perf_sysctl_unregister(void);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciint i915_perf_open_ioctl(struct drm_device *dev, void *data,
3062306a36Sopenharmony_ci			 struct drm_file *file);
3162306a36Sopenharmony_ciint i915_perf_add_config_ioctl(struct drm_device *dev, void *data,
3262306a36Sopenharmony_ci			       struct drm_file *file);
3362306a36Sopenharmony_ciint i915_perf_remove_config_ioctl(struct drm_device *dev, void *data,
3462306a36Sopenharmony_ci				  struct drm_file *file);
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_civoid i915_oa_init_reg_state(const struct intel_context *ce,
3762306a36Sopenharmony_ci			    const struct intel_engine_cs *engine);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_cistruct i915_oa_config *
4062306a36Sopenharmony_cii915_perf_get_oa_config(struct i915_perf *perf, int metrics_set);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cistatic inline struct i915_oa_config *
4362306a36Sopenharmony_cii915_oa_config_get(struct i915_oa_config *oa_config)
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	if (kref_get_unless_zero(&oa_config->ref))
4662306a36Sopenharmony_ci		return oa_config;
4762306a36Sopenharmony_ci	else
4862306a36Sopenharmony_ci		return NULL;
4962306a36Sopenharmony_ci}
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_civoid i915_oa_config_release(struct kref *ref);
5262306a36Sopenharmony_cistatic inline void i915_oa_config_put(struct i915_oa_config *oa_config)
5362306a36Sopenharmony_ci{
5462306a36Sopenharmony_ci	if (!oa_config)
5562306a36Sopenharmony_ci		return;
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_ci	kref_put(&oa_config->ref, i915_oa_config_release);
5862306a36Sopenharmony_ci}
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ciu32 i915_perf_oa_timestamp_frequency(struct drm_i915_private *i915);
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci#endif /* __I915_PERF_H__ */
63