diff options
author | Sidath Senanayake <sidaths@google.com> | 2018-12-06 09:09:59 +0100 |
---|---|---|
committer | Sidath Senanayake <sidaths@google.com> | 2018-12-06 09:09:59 +0100 |
commit | a970431fa55f99aba31ea4263fdc8e70019a9ccd (patch) | |
tree | 91bb7f49a4869c0385338fe144f53ac8b98468ea /mali_kbase/ipa | |
parent | f10b3de5283d0c196459f18160161e48cfadae81 (diff) | |
download | gpu-a970431fa55f99aba31ea4263fdc8e70019a9ccd.tar.gz |
Mali Bifrost DDK r16p0 KMD
Provenance:
aa8b3ff0f (collaborate/EAC/b_r16p0)
BX304L01B-BU-00000-r16p0-01rel0
BX304L06A-BU-00000-r16p0-01rel0
BX304X07X-BU-00000-r16p0-01rel0
Signed-off-by: Sidath Senanayake <sidaths@google.com>
Change-Id: I96125862b7cf6596d1b7109853fb4ca39e851056
Diffstat (limited to 'mali_kbase/ipa')
-rw-r--r-- | mali_kbase/ipa/mali_kbase_ipa.c | 46 | ||||
-rw-r--r-- | mali_kbase/ipa/mali_kbase_ipa.h | 33 | ||||
-rw-r--r-- | mali_kbase/ipa/mali_kbase_ipa_simple.c | 3 | ||||
-rw-r--r-- | mali_kbase/ipa/mali_kbase_ipa_vinstr_common.c | 126 | ||||
-rw-r--r-- | mali_kbase/ipa/mali_kbase_ipa_vinstr_common.h | 10 | ||||
-rw-r--r-- | mali_kbase/ipa/mali_kbase_ipa_vinstr_g7x.c | 65 |
6 files changed, 154 insertions, 129 deletions
diff --git a/mali_kbase/ipa/mali_kbase_ipa.c b/mali_kbase/ipa/mali_kbase_ipa.c index 520f8fc..9da2878 100644 --- a/mali_kbase/ipa/mali_kbase_ipa.c +++ b/mali_kbase/ipa/mali_kbase_ipa.c @@ -38,16 +38,15 @@ #endif #define KBASE_IPA_FALLBACK_MODEL_NAME "mali-simple-power-model" -#define KBASE_IPA_G71_MODEL_NAME "mali-g71-power-model" -#define KBASE_IPA_G72_MODEL_NAME "mali-g72-power-model" -#define KBASE_IPA_TNOX_MODEL_NAME "mali-tnox-power-model" -#define KBASE_IPA_TGOX_R1_MODEL_NAME "mali-tgox_r1-power-model" -static struct kbase_ipa_model_ops *kbase_ipa_all_model_ops[] = { +static const struct kbase_ipa_model_ops *kbase_ipa_all_model_ops[] = { &kbase_simple_ipa_model_ops, &kbase_g71_ipa_model_ops, &kbase_g72_ipa_model_ops, - &kbase_tnox_ipa_model_ops + &kbase_g76_ipa_model_ops, + &kbase_g52_ipa_model_ops, + &kbase_g52_r1_ipa_model_ops, + &kbase_g51_ipa_model_ops }; int kbase_ipa_model_recalculate(struct kbase_ipa_model *model) @@ -68,13 +67,13 @@ int kbase_ipa_model_recalculate(struct kbase_ipa_model *model) return err; } -static struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev, +const struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev, const char *name) { int i; for (i = 0; i < ARRAY_SIZE(kbase_ipa_all_model_ops); ++i) { - struct kbase_ipa_model_ops *ops = kbase_ipa_all_model_ops[i]; + const struct kbase_ipa_model_ops *ops = kbase_ipa_all_model_ops[i]; if (!strcmp(ops->name, name)) return ops; @@ -84,6 +83,7 @@ static struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device return NULL; } +KBASE_EXPORT_TEST_API(kbase_ipa_model_ops_find); const char *kbase_ipa_model_name_from_id(u32 gpu_id) { @@ -93,18 +93,20 @@ const char *kbase_ipa_model_name_from_id(u32 gpu_id) if (GPU_ID_IS_NEW_FORMAT(prod_id)) { switch (GPU_ID2_MODEL_MATCH_VALUE(prod_id)) { case GPU_ID2_PRODUCT_TMIX: - return KBASE_IPA_G71_MODEL_NAME; + return "mali-g71-power-model"; case GPU_ID2_PRODUCT_THEX: - return KBASE_IPA_G72_MODEL_NAME; + return "mali-g72-power-model"; case GPU_ID2_PRODUCT_TNOX: - return KBASE_IPA_TNOX_MODEL_NAME; + return "mali-g76-power-model"; + case GPU_ID2_PRODUCT_TSIX: + return "mali-g51-power-model"; case GPU_ID2_PRODUCT_TGOX: if ((gpu_id & GPU_ID2_VERSION_MAJOR) == (0 << GPU_ID2_VERSION_MAJOR_SHIFT)) - /* TGOX r0 shares a power model with TNOX */ - return KBASE_IPA_TNOX_MODEL_NAME; + /* g52 aliased to g76 power-model's ops */ + return "mali-g52-power-model"; else - return KBASE_IPA_TGOX_R1_MODEL_NAME; + return "mali-g52_r1-power-model"; default: return KBASE_IPA_FALLBACK_MODEL_NAME; } @@ -112,6 +114,7 @@ const char *kbase_ipa_model_name_from_id(u32 gpu_id) return KBASE_IPA_FALLBACK_MODEL_NAME; } +KBASE_EXPORT_TEST_API(kbase_ipa_model_name_from_id); static struct device_node *get_model_dt_node(struct kbase_ipa_model *model) { @@ -244,7 +247,7 @@ void kbase_ipa_term_model(struct kbase_ipa_model *model) KBASE_EXPORT_TEST_API(kbase_ipa_term_model); struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev, - struct kbase_ipa_model_ops *ops) + const struct kbase_ipa_model_ops *ops) { struct kbase_ipa_model *model; int err; @@ -298,7 +301,7 @@ int kbase_ipa_init(struct kbase_device *kbdev) { const char *model_name; - struct kbase_ipa_model_ops *ops; + const struct kbase_ipa_model_ops *ops; struct kbase_ipa_model *default_model = NULL; int err; @@ -371,6 +374,8 @@ void kbase_ipa_term(struct kbase_device *kbdev) mutex_lock(&kbdev->ipa.lock); kbase_ipa_term_locked(kbdev); mutex_unlock(&kbdev->ipa.lock); + + mutex_destroy(&kbdev->ipa.lock); } KBASE_EXPORT_TEST_API(kbase_ipa_term); @@ -517,6 +522,9 @@ static unsigned long kbase_get_static_power(unsigned long voltage) struct kbase_device *kbdev = kbase_find_device(-1); #endif + if (!kbdev) + return 0ul; + mutex_lock(&kbdev->ipa.lock); model = get_current_model(kbdev); @@ -552,6 +560,9 @@ static unsigned long kbase_get_dynamic_power(unsigned long freq, struct kbase_device *kbdev = kbase_find_device(-1); #endif + if (!kbdev) + return 0ul; + mutex_lock(&kbdev->ipa.lock); model = kbdev->ipa.fallback_model; @@ -627,6 +638,9 @@ int kbase_get_real_power(struct devfreq *df, u32 *power, int ret; struct kbase_device *kbdev = dev_get_drvdata(&df->dev); + if (!kbdev) + return -ENODEV; + mutex_lock(&kbdev->ipa.lock); ret = kbase_get_real_power_locked(kbdev, power, freq, voltage); mutex_unlock(&kbdev->ipa.lock); diff --git a/mali_kbase/ipa/mali_kbase_ipa.h b/mali_kbase/ipa/mali_kbase_ipa.h index 4656ded..7462048 100644 --- a/mali_kbase/ipa/mali_kbase_ipa.h +++ b/mali_kbase/ipa/mali_kbase_ipa.h @@ -40,7 +40,7 @@ struct devfreq; struct kbase_ipa_model { struct kbase_device *kbdev; void *model_data; - struct kbase_ipa_model_ops *ops; + const struct kbase_ipa_model_ops *ops; struct list_head params; bool missing_dt_node_warning; }; @@ -154,6 +154,25 @@ void kbase_ipa_term(struct kbase_device *kbdev); int kbase_ipa_model_recalculate(struct kbase_ipa_model *model); /** + * kbase_ipa_model_ops_find - Lookup an IPA model using its name + * @kbdev: pointer to kbase device + * @name: name of model to lookup + * + * Return: Pointer to model's 'ops' structure, or NULL if the lookup failed. + */ +const struct kbase_ipa_model_ops *kbase_ipa_model_ops_find(struct kbase_device *kbdev, + const char *name); + +/** + * kbase_ipa_model_name_from_id - Find the best model for a given GPU ID + * @gpu_id: GPU ID of GPU the model will be used for + * + * Return: The name of the appropriate counter-based model, or the name of the + * fallback model if no counter model exists. + */ +const char *kbase_ipa_model_name_from_id(u32 gpu_id); + +/** * kbase_ipa_init_model - Initilaize the particular IPA model * @kbdev: pointer to kbase device * @ops: pointer to object containing model specific methods. @@ -164,7 +183,7 @@ int kbase_ipa_model_recalculate(struct kbase_ipa_model *model); * Return: pointer to kbase_ipa_model on success, NULL on error */ struct kbase_ipa_model *kbase_ipa_init_model(struct kbase_device *kbdev, - struct kbase_ipa_model_ops *ops); + const struct kbase_ipa_model_ops *ops); /** * kbase_ipa_term_model - Terminate the particular IPA model * @model: pointer to the IPA model object, already initialized @@ -183,10 +202,12 @@ void kbase_ipa_term_model(struct kbase_ipa_model *model); */ void kbase_ipa_protection_mode_switch_event(struct kbase_device *kbdev); -extern struct kbase_ipa_model_ops kbase_g71_ipa_model_ops; -extern struct kbase_ipa_model_ops kbase_g72_ipa_model_ops; -extern struct kbase_ipa_model_ops kbase_tnox_ipa_model_ops; -extern struct kbase_ipa_model_ops kbase_tgox_r1_ipa_model_ops; +extern const struct kbase_ipa_model_ops kbase_g71_ipa_model_ops; +extern const struct kbase_ipa_model_ops kbase_g72_ipa_model_ops; +extern const struct kbase_ipa_model_ops kbase_g76_ipa_model_ops; +extern const struct kbase_ipa_model_ops kbase_g52_ipa_model_ops; +extern const struct kbase_ipa_model_ops kbase_g52_r1_ipa_model_ops; +extern const struct kbase_ipa_model_ops kbase_g51_ipa_model_ops; /** * kbase_get_real_power() - get the real power consumption of the GPU diff --git a/mali_kbase/ipa/mali_kbase_ipa_simple.c b/mali_kbase/ipa/mali_kbase_ipa_simple.c index e684df4..c8399ab 100644 --- a/mali_kbase/ipa/mali_kbase_ipa_simple.c +++ b/mali_kbase/ipa/mali_kbase_ipa_simple.c @@ -268,8 +268,9 @@ static int kbase_simple_power_model_init(struct kbase_ipa_model *model) (void *) model_data, "mali-simple-power-model-temp-poll"); if (IS_ERR(model_data->poll_temperature_thread)) { + err = PTR_ERR(model_data->poll_temperature_thread); kfree(model_data); - return PTR_ERR(model_data->poll_temperature_thread); + return err; } err = add_params(model); diff --git a/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.c b/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.c index 69c3230..1a6ba01 100644 --- a/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.c +++ b/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.c @@ -44,7 +44,7 @@ static inline u32 kbase_ipa_read_hwcnt( struct kbase_ipa_model_vinstr_data *model_data, u32 offset) { - u8 *p = model_data->vinstr_buffer; + u8 *p = (u8 *)model_data->dump_buf.dump_buf; return *(u32 *)&p[offset]; } @@ -118,125 +118,69 @@ s64 kbase_ipa_single_counter( return counter_value * (s64) coeff; } -#ifndef CONFIG_MALI_NO_MALI -/** - * kbase_ipa_gpu_active - Inform IPA that GPU is now active - * @model_data: Pointer to model data - * - * This function may cause vinstr to become active. - */ -static void kbase_ipa_gpu_active(struct kbase_ipa_model_vinstr_data *model_data) +int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data) { + int errcode; struct kbase_device *kbdev = model_data->kbdev; + struct kbase_hwcnt_virtualizer *hvirt = kbdev->hwcnt_gpu_virt; + struct kbase_hwcnt_enable_map enable_map; + const struct kbase_hwcnt_metadata *metadata = + kbase_hwcnt_virtualizer_metadata(hvirt); - lockdep_assert_held(&kbdev->pm.lock); + if (!metadata) + return -1; - if (!kbdev->ipa.vinstr_active) { - kbdev->ipa.vinstr_active = true; - kbase_vinstr_resume_client(model_data->vinstr_cli); + errcode = kbase_hwcnt_enable_map_alloc(metadata, &enable_map); + if (errcode) { + dev_err(kbdev->dev, "Failed to allocate IPA enable map"); + return errcode; } -} -/** - * kbase_ipa_gpu_idle - Inform IPA that GPU is now idle - * @model_data: Pointer to model data - * - * This function may cause vinstr to become idle. - */ -static void kbase_ipa_gpu_idle(struct kbase_ipa_model_vinstr_data *model_data) -{ - struct kbase_device *kbdev = model_data->kbdev; + kbase_hwcnt_enable_map_enable_all(&enable_map); - lockdep_assert_held(&kbdev->pm.lock); - - if (kbdev->ipa.vinstr_active) { - kbase_vinstr_suspend_client(model_data->vinstr_cli); - kbdev->ipa.vinstr_active = false; + errcode = kbase_hwcnt_virtualizer_client_create( + hvirt, &enable_map, &model_data->hvirt_cli); + kbase_hwcnt_enable_map_free(&enable_map); + if (errcode) { + dev_err(kbdev->dev, "Failed to register IPA with virtualizer"); + model_data->hvirt_cli = NULL; + return errcode; } -} -#endif - -int kbase_ipa_attach_vinstr(struct kbase_ipa_model_vinstr_data *model_data) -{ - struct kbase_device *kbdev = model_data->kbdev; - struct kbase_ioctl_hwcnt_reader_setup setup; - size_t dump_size; - dump_size = kbase_vinstr_dump_size(kbdev); - model_data->vinstr_buffer = kzalloc(dump_size, GFP_KERNEL); - if (!model_data->vinstr_buffer) { + errcode = kbase_hwcnt_dump_buffer_alloc( + metadata, &model_data->dump_buf); + if (errcode) { dev_err(kbdev->dev, "Failed to allocate IPA dump buffer"); - return -1; - } - - setup.jm_bm = ~0u; - setup.shader_bm = ~0u; - setup.tiler_bm = ~0u; - setup.mmu_l2_bm = ~0u; - model_data->vinstr_cli = kbase_vinstr_hwcnt_kernel_setup(kbdev->vinstr_ctx, - &setup, model_data->vinstr_buffer); - if (!model_data->vinstr_cli) { - dev_err(kbdev->dev, "Failed to register IPA with vinstr core"); - kfree(model_data->vinstr_buffer); - model_data->vinstr_buffer = NULL; - return -1; + kbase_hwcnt_virtualizer_client_destroy(model_data->hvirt_cli); + model_data->hvirt_cli = NULL; + return errcode; } - kbase_vinstr_hwc_clear(model_data->vinstr_cli); - -#ifndef CONFIG_MALI_NO_MALI - kbdev->ipa.gpu_active_callback = kbase_ipa_gpu_active; - kbdev->ipa.gpu_idle_callback = kbase_ipa_gpu_idle; - kbdev->ipa.model_data = model_data; - kbdev->ipa.vinstr_active = false; - /* Suspend vinstr, to ensure that the GPU is powered off until there is - * something to execute. - */ - kbase_vinstr_suspend_client(model_data->vinstr_cli); -#else - kbdev->ipa.gpu_active_callback = NULL; - kbdev->ipa.gpu_idle_callback = NULL; - kbdev->ipa.vinstr_active = true; -#endif - return 0; } void kbase_ipa_detach_vinstr(struct kbase_ipa_model_vinstr_data *model_data) { - struct kbase_device *kbdev = model_data->kbdev; - - kbdev->ipa.gpu_active_callback = NULL; - kbdev->ipa.gpu_idle_callback = NULL; - kbdev->ipa.model_data = NULL; - kbdev->ipa.vinstr_active = false; - - if (model_data->vinstr_cli) - kbase_vinstr_detach_client(model_data->vinstr_cli); - - model_data->vinstr_cli = NULL; - kfree(model_data->vinstr_buffer); - model_data->vinstr_buffer = NULL; + if (model_data->hvirt_cli) { + kbase_hwcnt_virtualizer_client_destroy(model_data->hvirt_cli); + kbase_hwcnt_dump_buffer_free(&model_data->dump_buf); + model_data->hvirt_cli = NULL; + } } int kbase_ipa_vinstr_dynamic_coeff(struct kbase_ipa_model *model, u32 *coeffp) { struct kbase_ipa_model_vinstr_data *model_data = (struct kbase_ipa_model_vinstr_data *)model->model_data; - struct kbase_device *kbdev = model_data->kbdev; s64 energy = 0; size_t i; u64 coeff = 0, coeff_mul = 0; + u64 start_ts_ns, end_ts_ns; u32 active_cycles; int err = 0; - if (!kbdev->ipa.vinstr_active) { - err = -ENODATA; - goto err0; /* GPU powered off - no counters to collect */ - } - - err = kbase_vinstr_hwc_dump(model_data->vinstr_cli, - BASE_HWCNT_READER_EVENT_MANUAL); + err = kbase_hwcnt_virtualizer_client_dump(model_data->hvirt_cli, + &start_ts_ns, &end_ts_ns, &model_data->dump_buf); if (err) goto err0; diff --git a/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.h b/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.h index 0deafae..46e3cd4 100644 --- a/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.h +++ b/mali_kbase/ipa/mali_kbase_ipa_vinstr_common.h @@ -24,6 +24,8 @@ #define _KBASE_IPA_VINSTR_COMMON_H_ #include "mali_kbase.h" +#include "mali_kbase_hwcnt_virtualizer.h" +#include "mali_kbase_hwcnt_types.h" /* Maximum number of IPA groups for an IPA model. */ #define KBASE_IPA_MAX_GROUP_DEF_NUM 16 @@ -49,8 +51,8 @@ typedef u32 (*kbase_ipa_get_active_cycles_callback)(struct kbase_ipa_model_vinst * @groups_def_num: Number of elements in the array of IPA groups. * @get_active_cycles: Callback to return number of active cycles during * counter sample period - * @vinstr_cli: vinstr client handle - * @vinstr_buffer: buffer to dump hardware counters onto + * @hvirt_cli: hardware counter virtualizer client handle + * @dump_buf: buffer to dump hardware counters onto * @reference_voltage: voltage, in mV, of the operating point used when * deriving the power model coefficients. Range approx * 0.1V - 5V (~= 8V): 2^7 <= reference_voltage <= 2^13 @@ -72,8 +74,8 @@ struct kbase_ipa_model_vinstr_data { const struct kbase_ipa_group *groups_def; size_t groups_def_num; kbase_ipa_get_active_cycles_callback get_active_cycles; - struct kbase_vinstr_client *vinstr_cli; - void *vinstr_buffer; + struct kbase_hwcnt_virtualizer_client *hvirt_cli; + struct kbase_hwcnt_dump_buffer dump_buf; s32 reference_voltage; s32 scaling_factor; s32 min_sample_cycles; diff --git a/mali_kbase/ipa/mali_kbase_ipa_vinstr_g7x.c b/mali_kbase/ipa/mali_kbase_ipa_vinstr_g7x.c index 8366033..6365d2f 100644 --- a/mali_kbase/ipa/mali_kbase_ipa_vinstr_g7x.c +++ b/mali_kbase/ipa/mali_kbase_ipa_vinstr_g7x.c @@ -248,7 +248,7 @@ static const struct kbase_ipa_group ipa_groups_def_g72[] = { }, }; -static const struct kbase_ipa_group ipa_groups_def_tnox[] = { +static const struct kbase_ipa_group ipa_groups_def_g76[] = { { .name = "gpu_active", .default_value = 122000, @@ -281,7 +281,7 @@ static const struct kbase_ipa_group ipa_groups_def_tnox[] = { }, }; -static const struct kbase_ipa_group ipa_groups_def_tgox_r1[] = { +static const struct kbase_ipa_group ipa_groups_def_g52_r1[] = { { .name = "gpu_active", .default_value = 224200, @@ -314,6 +314,48 @@ static const struct kbase_ipa_group ipa_groups_def_tgox_r1[] = { }, }; +static const struct kbase_ipa_group ipa_groups_def_g51[] = { + { + .name = "gpu_active", + .default_value = 201400, + .op = kbase_g7x_jm_single_counter, + .counter_block_offset = JM_GPU_ACTIVE, + }, + { + .name = "exec_instr_count", + .default_value = 392700, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_EXEC_INSTR_COUNT, + }, + { + .name = "vary_instr", + .default_value = 274000, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_VARY_INSTR, + }, + { + .name = "tex_tfch_num_operations", + .default_value = 528000, + .op = kbase_g7x_sum_all_shader_cores, + .counter_block_offset = SC_TEX_TFCH_NUM_OPERATIONS, + }, + { + .name = "l2_access", + .default_value = 506400, + .op = kbase_g7x_sum_all_memsys_blocks, + .counter_block_offset = MEMSYS_L2_ANY_LOOKUP, + }, +}; + +#define IPA_POWER_MODEL_OPS(gpu, init_token) \ + const struct kbase_ipa_model_ops kbase_ ## gpu ## _ipa_model_ops = { \ + .name = "mali-" #gpu "-power-model", \ + .init = kbase_ ## init_token ## _power_model_init, \ + .term = kbase_ipa_vinstr_common_model_term, \ + .get_dynamic_coeff = kbase_ipa_vinstr_dynamic_coeff, \ + }; \ + KBASE_EXPORT_TEST_API(kbase_ ## gpu ## _ipa_model_ops) + #define STANDARD_POWER_MODEL(gpu, reference_voltage) \ static int kbase_ ## gpu ## _power_model_init(\ struct kbase_ipa_model *model) \ @@ -326,15 +368,16 @@ static const struct kbase_ipa_group ipa_groups_def_tgox_r1[] = { kbase_g7x_get_active_cycles, \ (reference_voltage)); \ } \ - struct kbase_ipa_model_ops kbase_ ## gpu ## _ipa_model_ops = { \ - .name = "mali-" #gpu "-power-model", \ - .init = kbase_ ## gpu ## _power_model_init, \ - .term = kbase_ipa_vinstr_common_model_term, \ - .get_dynamic_coeff = kbase_ipa_vinstr_dynamic_coeff, \ - }; \ - KBASE_EXPORT_TEST_API(kbase_ ## gpu ## _ipa_model_ops) + IPA_POWER_MODEL_OPS(gpu, gpu) + +#define ALIAS_POWER_MODEL(gpu, as_gpu) \ + IPA_POWER_MODEL_OPS(gpu, as_gpu) STANDARD_POWER_MODEL(g71, 800); STANDARD_POWER_MODEL(g72, 800); -STANDARD_POWER_MODEL(tnox, 800); -STANDARD_POWER_MODEL(tgox_r1, 1000); +STANDARD_POWER_MODEL(g76, 800); +STANDARD_POWER_MODEL(g52_r1, 1000); +STANDARD_POWER_MODEL(g51, 1000); + +/* g52 is an alias of g76 (TNOX) for IPA */ +ALIAS_POWER_MODEL(g52, g76); |