OA reports in the OA buffer contain an OA timestamp field that helps user calculate delta between 2 OA reports. The calculation relies on the CS timestamp frequency to convert the timestamp value to nanoseconds. The CS timestamp frequency is a function of the CTC_SHIFT value in RPM_CONFIG0. In DG2, OA unit assumes that the CTC_SHIFT is 3, instead of using the actual value from RPM_CONFIG0. At the user level, this results in an error in calculating delta between 2 OA reports since the OA timestamp is not shifted in the same manner as CS timestamp. Also the periodicity of the reports is different from what the user configured because of mismatch in the CS and OA frequencies. The issue also affects MI_REPORT_PERF_COUNT command. To resolve this, return actual OA timestamp frequency to the user in i915_getparam_ioctl, so that user can calculate the right OA exponent as well as interpret the reports correctly. MR: https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18893 v2: - Use REG_FIELD_GET (Ashutosh) - Update commit msg Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com> Reviewed-by: Ashutosh Dixit <ashutosh.dixit@intel.com> Signed-off-by: John Harrison <John.C.Harrison@Intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20221026222102.5526-13-umesh.nerlige.ramappa@intel.com
63 lines
1.6 KiB
C
63 lines
1.6 KiB
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2019 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __I915_PERF_H__
|
|
#define __I915_PERF_H__
|
|
|
|
#include <linux/kref.h>
|
|
#include <linux/types.h>
|
|
|
|
#include "i915_perf_types.h"
|
|
|
|
struct drm_device;
|
|
struct drm_file;
|
|
struct drm_i915_private;
|
|
struct i915_oa_config;
|
|
struct intel_context;
|
|
struct intel_engine_cs;
|
|
|
|
void i915_perf_init(struct drm_i915_private *i915);
|
|
void i915_perf_fini(struct drm_i915_private *i915);
|
|
void i915_perf_register(struct drm_i915_private *i915);
|
|
void i915_perf_unregister(struct drm_i915_private *i915);
|
|
int i915_perf_ioctl_version(void);
|
|
int i915_perf_sysctl_register(void);
|
|
void i915_perf_sysctl_unregister(void);
|
|
|
|
int i915_perf_open_ioctl(struct drm_device *dev, void *data,
|
|
struct drm_file *file);
|
|
int i915_perf_add_config_ioctl(struct drm_device *dev, void *data,
|
|
struct drm_file *file);
|
|
int i915_perf_remove_config_ioctl(struct drm_device *dev, void *data,
|
|
struct drm_file *file);
|
|
|
|
void i915_oa_init_reg_state(const struct intel_context *ce,
|
|
const struct intel_engine_cs *engine);
|
|
|
|
struct i915_oa_config *
|
|
i915_perf_get_oa_config(struct i915_perf *perf, int metrics_set);
|
|
|
|
static inline struct i915_oa_config *
|
|
i915_oa_config_get(struct i915_oa_config *oa_config)
|
|
{
|
|
if (kref_get_unless_zero(&oa_config->ref))
|
|
return oa_config;
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
void i915_oa_config_release(struct kref *ref);
|
|
static inline void i915_oa_config_put(struct i915_oa_config *oa_config)
|
|
{
|
|
if (!oa_config)
|
|
return;
|
|
|
|
kref_put(&oa_config->ref, i915_oa_config_release);
|
|
}
|
|
|
|
u32 i915_perf_oa_timestamp_frequency(struct drm_i915_private *i915);
|
|
|
|
#endif /* __I915_PERF_H__ */
|