diff options
Diffstat (limited to 'drivers/gpu/mali/mali400ko/driver/src/devicedrv/mali/common/mali_kernel_profiling.c')
-rw-r--r-- | drivers/gpu/mali/mali400ko/driver/src/devicedrv/mali/common/mali_kernel_profiling.c | 177 |
1 files changed, 121 insertions, 56 deletions
diff --git a/drivers/gpu/mali/mali400ko/driver/src/devicedrv/mali/common/mali_kernel_profiling.c b/drivers/gpu/mali/mali400ko/driver/src/devicedrv/mali/common/mali_kernel_profiling.c index 07bb894b1b4..1f3eb4aa778 100644 --- a/drivers/gpu/mali/mali400ko/driver/src/devicedrv/mali/common/mali_kernel_profiling.c +++ b/drivers/gpu/mali/mali400ko/driver/src/devicedrv/mali/common/mali_kernel_profiling.c @@ -13,8 +13,7 @@ #include "mali_osk_mali.h" #include "mali_ukk.h" #include "mali_timestamp.h" - -#define MALI_PROFILING_MAX_BUFFER_ENTRIES 1048576 +#include "mali_kernel_profiling.h" typedef struct mali_profiling_entry { @@ -39,9 +38,9 @@ static mali_profiling_entry* profile_entries = NULL; static u32 profile_entry_count = 0; static _mali_osk_atomic_t profile_insert_index; static _mali_osk_atomic_t profile_entries_written; +static mali_bool mali_profiling_default_enable = MALI_FALSE; - -_mali_osk_errcode_t _mali_profiling_init(void) +_mali_osk_errcode_t _mali_profiling_init(mali_bool auto_start) { profile_entries = NULL; profile_entry_count = 0; @@ -56,6 +55,17 @@ _mali_osk_errcode_t _mali_profiling_init(void) prof_state = MALI_PROFILING_STATE_IDLE; + if (MALI_TRUE == auto_start) + { + u32 limit = MALI_PROFILING_MAX_BUFFER_ENTRIES; /* Use maximum buffer size */ + + mali_profiling_default_enable = MALI_TRUE; /* save this so user space can query this on their startup */ + if (_MALI_OSK_ERR_OK != _mali_profiling_start(&limit)) + { + return _MALI_OSK_ERR_FAULT; + } + } + return _MALI_OSK_ERR_OK; } @@ -71,7 +81,7 @@ void _mali_profiling_term(void) if (NULL != profile_entries) { - _mali_osk_free(profile_entries); + _mali_osk_vfree(profile_entries); profile_entries = NULL; } @@ -82,35 +92,7 @@ void _mali_profiling_term(void) } } -inline _mali_osk_errcode_t _mali_profiling_add_event(u32 event_id, u32 data0, u32 data1, u32 data2, u32 data3, u32 data4) -{ - u32 cur_index = _mali_osk_atomic_inc_return(&profile_insert_index) - 1; - - if (prof_state != MALI_PROFILING_STATE_RUNNING || cur_index >= profile_entry_count) - { - /* - * Not in recording mode, or buffer is full - * Decrement index again, and early out - */ - _mali_osk_atomic_dec(&profile_insert_index); - return _MALI_OSK_ERR_FAULT; - } - - profile_entries[cur_index].timestamp = _mali_timestamp_get(); - profile_entries[cur_index].event_id = event_id; - profile_entries[cur_index].data[0] = data0; - profile_entries[cur_index].data[1] = data1; - profile_entries[cur_index].data[2] = data2; - profile_entries[cur_index].data[3] = data3; - profile_entries[cur_index].data[4] = data4; - - _mali_osk_atomic_inc(&profile_entries_written); - - return _MALI_OSK_ERR_OK; -} - - -_mali_osk_errcode_t _mali_ukk_profiling_start(_mali_uk_profiling_start_s *args) +inline _mali_osk_errcode_t _mali_profiling_start(u32 * limit) { _mali_osk_errcode_t ret; @@ -122,13 +104,13 @@ _mali_osk_errcode_t _mali_ukk_profiling_start(_mali_uk_profiling_start_s *args) return _MALI_OSK_ERR_INVALID_ARGS; /* invalid to call this function in this state */ } - if (args->limit > MALI_PROFILING_MAX_BUFFER_ENTRIES) + if (*limit > MALI_PROFILING_MAX_BUFFER_ENTRIES) { - args->limit = MALI_PROFILING_MAX_BUFFER_ENTRIES; + *limit = MALI_PROFILING_MAX_BUFFER_ENTRIES; } - profile_entries = _mali_osk_malloc(args->limit * sizeof(mali_profiling_entry)); - profile_entry_count = args->limit; + profile_entries = _mali_osk_valloc(*limit * sizeof(mali_profiling_entry)); + profile_entry_count = *limit; if (NULL == profile_entries) { _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW); @@ -143,7 +125,7 @@ _mali_osk_errcode_t _mali_ukk_profiling_start(_mali_uk_profiling_start_s *args) } else { - _mali_osk_free(profile_entries); + _mali_osk_vfree(profile_entries); profile_entries = NULL; } @@ -151,13 +133,34 @@ _mali_osk_errcode_t _mali_ukk_profiling_start(_mali_uk_profiling_start_s *args) return ret; } -_mali_osk_errcode_t _mali_ukk_profiling_add_event(_mali_uk_profiling_add_event_s *args) +inline _mali_osk_errcode_t _mali_profiling_add_event(u32 event_id, u32 data0, u32 data1, u32 data2, u32 data3, u32 data4) { - /* Always add process and thread identificator in the first two data elements for events from user space */ - return _mali_profiling_add_event(args->event_id, _mali_osk_get_pid(), _mali_osk_get_tid(), args->data[2], args->data[3], args->data[4]); + u32 cur_index = _mali_osk_atomic_inc_return(&profile_insert_index) - 1; + + if (prof_state != MALI_PROFILING_STATE_RUNNING || cur_index >= profile_entry_count) + { + /* + * Not in recording mode, or buffer is full + * Decrement index again, and early out + */ + _mali_osk_atomic_dec(&profile_insert_index); + return _MALI_OSK_ERR_FAULT; + } + + profile_entries[cur_index].timestamp = _mali_timestamp_get(); + profile_entries[cur_index].event_id = event_id; + profile_entries[cur_index].data[0] = data0; + profile_entries[cur_index].data[1] = data1; + profile_entries[cur_index].data[2] = data2; + profile_entries[cur_index].data[3] = data3; + profile_entries[cur_index].data[4] = data4; + + _mali_osk_atomic_inc(&profile_entries_written); + + return _MALI_OSK_ERR_OK; } -_mali_osk_errcode_t _mali_ukk_profiling_stop(_mali_uk_profiling_stop_s *args) +inline _mali_osk_errcode_t _mali_profiling_stop(u32 * count) { _mali_osk_lock_wait(lock, _MALI_OSK_LOCKMODE_RW); @@ -178,16 +181,27 @@ _mali_osk_errcode_t _mali_ukk_profiling_stop(_mali_uk_profiling_stop_s *args) /* do nothing */; } - args->count = _mali_osk_atomic_read(&profile_insert_index); + *count = _mali_osk_atomic_read(&profile_insert_index); return _MALI_OSK_ERR_OK; } - -_mali_osk_errcode_t _mali_ukk_profiling_get_event(_mali_uk_profiling_get_event_s *args) +inline u32 _mali_profiling_get_count(void) { - u32 index = args->index; + u32 retval = 0; + + _mali_osk_lock_wait(lock, _MALI_OSK_LOCKMODE_RW); + if (prof_state == MALI_PROFILING_STATE_RETURN) + { + retval = _mali_osk_atomic_read(&profile_entries_written); + } + _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW); + return retval; +} + +inline _mali_osk_errcode_t _mali_profiling_get_event(u32 index, u64* timestamp, u32* event_id, u32 data[5]) +{ _mali_osk_lock_wait(lock, _MALI_OSK_LOCKMODE_RW); if (prof_state != MALI_PROFILING_STATE_RETURN) @@ -202,19 +216,19 @@ _mali_osk_errcode_t _mali_ukk_profiling_get_event(_mali_uk_profiling_get_event_s return _MALI_OSK_ERR_FAULT; } - args->timestamp = profile_entries[index].timestamp; - args->event_id = profile_entries[index].event_id; - args->data[0] = profile_entries[index].data[0]; - args->data[1] = profile_entries[index].data[1]; - args->data[2] = profile_entries[index].data[2]; - args->data[3] = profile_entries[index].data[3]; - args->data[4] = profile_entries[index].data[4]; + *timestamp = profile_entries[index].timestamp; + *event_id = profile_entries[index].event_id; + data[0] = profile_entries[index].data[0]; + data[1] = profile_entries[index].data[1]; + data[2] = profile_entries[index].data[2]; + data[3] = profile_entries[index].data[3]; + data[4] = profile_entries[index].data[4]; _mali_osk_lock_signal(lock, _MALI_OSK_LOCKMODE_RW); return _MALI_OSK_ERR_OK; } -_mali_osk_errcode_t _mali_ukk_profiling_clear(_mali_uk_profiling_clear_s *args) +inline _mali_osk_errcode_t _mali_profiling_clear(void) { _mali_osk_lock_wait(lock, _MALI_OSK_LOCKMODE_RW); @@ -230,7 +244,7 @@ _mali_osk_errcode_t _mali_ukk_profiling_clear(_mali_uk_profiling_clear_s *args) _mali_osk_atomic_init(&profile_entries_written, 0); if (NULL != profile_entries) { - _mali_osk_free(profile_entries); + _mali_osk_vfree(profile_entries); profile_entries = NULL; } @@ -238,3 +252,54 @@ _mali_osk_errcode_t _mali_ukk_profiling_clear(_mali_uk_profiling_clear_s *args) return _MALI_OSK_ERR_OK; } +mali_bool _mali_profiling_is_recording(void) +{ + return prof_state == MALI_PROFILING_STATE_RUNNING ? MALI_TRUE : MALI_FALSE; +} + +mali_bool _mali_profiling_have_recording(void) +{ + return prof_state == MALI_PROFILING_STATE_RETURN ? MALI_TRUE : MALI_FALSE; +} + +void _mali_profiling_set_default_enable_state(mali_bool enable) +{ + mali_profiling_default_enable = enable; +} + +mali_bool _mali_profiling_get_default_enable_state(void) +{ + return mali_profiling_default_enable; +} + +_mali_osk_errcode_t _mali_ukk_profiling_start(_mali_uk_profiling_start_s *args) +{ + return _mali_profiling_start(&args->limit); +} + +_mali_osk_errcode_t _mali_ukk_profiling_add_event(_mali_uk_profiling_add_event_s *args) +{ + /* Always add process and thread identificator in the first two data elements for events from user space */ + return _mali_profiling_add_event(args->event_id, _mali_osk_get_pid(), _mali_osk_get_tid(), args->data[2], args->data[3], args->data[4]); +} + +_mali_osk_errcode_t _mali_ukk_profiling_stop(_mali_uk_profiling_stop_s *args) +{ + return _mali_profiling_stop(&args->count); +} + +_mali_osk_errcode_t _mali_ukk_profiling_get_event(_mali_uk_profiling_get_event_s *args) +{ + return _mali_profiling_get_event(args->index, &args->timestamp, &args->event_id, args->data); +} + +_mali_osk_errcode_t _mali_ukk_profiling_clear(_mali_uk_profiling_clear_s *args) +{ + return _mali_profiling_clear(); +} + +_mali_osk_errcode_t _mali_ukk_profiling_get_config(_mali_uk_profiling_get_config_s *args) +{ + args->enable_events = mali_profiling_default_enable; + return _MALI_OSK_ERR_OK; +} |