blob: d212c875951ba692bc7de8e5f47de23638123f71 [file] [log] [blame]
/*
*
* (C) COPYRIGHT 2017 ARM Limited. All rights reserved.
*
* This program is free software and is provided to you under the terms of the
* GNU General Public License version 2 as published by the Free Software
* Foundation, and any use by you of this program is subject to the terms
* of such GNU licence.
*
* A copy of the licence is included with the program, and can also be obtained
* from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
*/
#ifndef _KBASE_IPA_VINSTR_COMMON_H_
#define _KBASE_IPA_VINSTR_COMMON_H_
#include "mali_kbase.h"
/* Maximum length for the name of an IPA group. */
#define KBASE_IPA_MAX_GROUP_NAME_LEN 15
/* Maximum number of IPA groups for an IPA model. */
#define KBASE_IPA_MAX_GROUP_DEF_NUM 16
/* Number of bytes per hardware counter in a vinstr_buffer. */
#define KBASE_IPA_NR_BYTES_PER_CNT 4
/* Number of hardware counters per block in a vinstr_buffer. */
#define KBASE_IPA_NR_CNT_PER_BLOCK 64
/* Number of bytes per block in a vinstr_buffer. */
#define KBASE_IPA_NR_BYTES_PER_BLOCK \
(KBASE_IPA_NR_CNT_PER_BLOCK * KBASE_IPA_NR_BYTES_PER_CNT)
/**
* struct kbase_ipa_model_vinstr_data - IPA context per device
* @kbdev: pointer to kbase device
* @groups_def: Array of IPA groups.
* @groups_def_num: Number of elements in the array of IPA groups.
* @vinstr_cli: vinstr client handle
* @vinstr_buffer: buffer to dump hardware counters onto
* @last_sample_read_time: timestamp of last vinstr buffer read
* @scaling_factor: user-specified power scaling factor. This is
* interpreted as a fraction where the denominator is
* 1000. Range approx 0.0-32.0:
* 0 < scaling_factor < 2^15
*/
struct kbase_ipa_model_vinstr_data {
struct kbase_device *kbdev;
s32 group_values[KBASE_IPA_MAX_GROUP_DEF_NUM];
const struct kbase_ipa_group *groups_def;
size_t groups_def_num;
struct kbase_vinstr_client *vinstr_cli;
void *vinstr_buffer;
ktime_t last_sample_read_time;
s32 scaling_factor;
};
/**
* struct ipa_group - represents a single IPA group
* @name: name of the IPA group
* @default_value: default value of coefficient for IPA group.
* Coefficients are interpreted as fractions where the
* denominator is 1000000.
* @op: which operation to be performed on the counter values
* @counter_block_offset: block offset in bytes of the counter used to calculate energy for IPA group
*/
struct kbase_ipa_group {
char name[KBASE_IPA_MAX_GROUP_NAME_LEN + 1];
s32 default_value;
s64 (*op)(struct kbase_ipa_model_vinstr_data *, s32, u32);
u32 counter_block_offset;
};
/**
* sum_all_shader_cores() - sum a counter over all cores
* @model_data pointer to model data
* @coeff model coefficient. Unity is ~2^20, so range approx
* +/- 4.0: -2^22 < coeff < 2^22
* @counter offset in bytes of the counter used to calculate energy for IPA group
*
* Calculate energy estimation based on hardware counter `counter'
* across all shader cores.
*
* Return: Sum of counter values. Range: -2^34 < ret < 2^34
*/
s64 kbase_ipa_sum_all_shader_cores(
struct kbase_ipa_model_vinstr_data *model_data,
s32 coeff, u32 counter);
/**
* sum_single_counter() - sum a single counter
* @model_data pointer to model data
* @coeff model coefficient. Unity is ~2^20, so range approx
* +/- 4.0: -2^22 < coeff < 2^22
* @counter offset in bytes of the counter used to calculate energy for IPA group
*
* Calculate energy estimation based on hardware counter `counter'.
*
* Return: Counter value. Range: -2^34 < ret < 2^34
*/
s64 kbase_ipa_single_counter(
struct kbase_ipa_model_vinstr_data *model_data,
s32 coeff, u32 counter);
/**
* attach_vinstr() - attach a vinstr_buffer to an IPA model.
* @model_data pointer to model data
*
* Attach a vinstr_buffer to an IPA model. The vinstr_buffer
* allows access to the hardware counters used to calculate
* energy consumption.
*
* Return: 0 on success, or an error code.
*/
int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data);
/**
* detach_vinstr() - detach a vinstr_buffer from an IPA model.
* @model_data pointer to model data
*
* Detach a vinstr_buffer from an IPA model.
*/
void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data);
/**
* kbase_ipa_vinstr_dynamic_coeff() - calculate dynamic power based on HW counters
* @model: pointer to instantiated model
* @coeffp: pointer to location where calculated power, in
* pW/(Hz V^2), is stored.
* @current_freq: frequency the GPU has been running at over the sample
* period. In Hz. Range: 10 MHz < 1GHz,
* 2^20 < current_freq < 2^30
*
* This is a GPU-agnostic implementation of the get_dynamic_coeff()
* function of an IPA model. It relies on the model being populated
* with GPU-specific attributes at initialization time.
*
* Return: 0 on success, or an error code.
*/
int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp,
u32 current_freq);
#if MALI_UNIT_TEST
/**
* kbase_ipa_set_dummy_time() - set a dummy monotonic time value
* @t: a monotonic time value
*
* This is only intended for use in unit tests, to ensure that the kernel time
* values used by a power model are predictable. Deterministic behavior is
* necessary to allow validation of the dynamic power values computed by the
* model.
*/
void kbase_ipa_set_dummy_time(ktime_t t);
#endif /* MALI_UNIT_TEST */
#endif /* _KBASE_IPA_VINSTR_COMMON_H_ */