| /* Copyright (c) 2013-2014, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| */ |
| #ifndef __ADRENO_PROFILE_H |
| #define __ADRENO_PROFILE_H |
| #include <linux/seq_file.h> |
| |
| /** |
| * struct adreno_profile_assigns_list: linked list for assigned perf counters |
| * @list: linkage for nodes in list |
| * @name: group name or GPU name name |
| * @groupid: group id |
| * @countable: countable assigned to perfcounter |
| * @offset: perfcounter register address offset |
| */ |
| struct adreno_profile_assigns_list { |
| struct list_head list; |
| char name[25]; |
| unsigned int groupid; |
| unsigned int countable; |
| unsigned int offset; /* LO offset */ |
| unsigned int offset_hi; /* HI offset */ |
| }; |
| |
| struct adreno_profile { |
| struct list_head assignments_list; /* list of all assignments */ |
| unsigned int assignment_count; /* Number of assigned counters */ |
| unsigned int *log_buffer; |
| unsigned int *log_head; |
| unsigned int *log_tail; |
| bool enabled; |
| /* counter, pre_ib, and post_ib held in one large circular buffer |
| * shared between kgsl and GPU |
| * counter entry 0 |
| * pre_ib entry 0 |
| * post_ib entry 0 |
| * ... |
| * counter entry N |
| * pre_ib entry N |
| * post_ib entry N |
| */ |
| struct kgsl_memdesc shared_buffer; |
| unsigned int shared_head; |
| unsigned int shared_tail; |
| unsigned int shared_size; |
| }; |
| |
| #define ADRENO_PROFILE_SHARED_BUF_SIZE_DWORDS (48 * 4096 / sizeof(uint)) |
| /* sized @ 48 pages should allow for over 50 outstanding IBs minimum, 1755 max*/ |
| |
| #define ADRENO_PROFILE_LOG_BUF_SIZE (1024 * 920) |
| /* sized for 1024 entries of fully assigned 45 cnters in log buffer, 230 pages*/ |
| #define ADRENO_PROFILE_LOG_BUF_SIZE_DWORDS (ADRENO_PROFILE_LOG_BUF_SIZE / \ |
| sizeof(unsigned int)) |
| |
| #ifdef CONFIG_DEBUG_FS |
| void adreno_profile_init(struct adreno_device *adreno_dev); |
| void adreno_profile_close(struct adreno_device *adreno_dev); |
| int adreno_profile_process_results(struct adreno_device *adreno_dev); |
| void adreno_profile_preib_processing(struct adreno_device *adreno_dev, |
| struct adreno_context *drawctxt, unsigned int *cmd_flags, |
| unsigned int **rbptr); |
| void adreno_profile_postib_processing(struct adreno_device *adreno_dev, |
| unsigned int *cmd_flags, unsigned int **rbptr); |
| #else |
| static inline void adreno_profile_init(struct adreno_device *adreno_dev) { } |
| static inline void adreno_profile_close(struct adreno_device *adreno_dev) { } |
| static inline int adreno_profile_process_results( |
| struct adreno_device *adreno_dev) |
| { |
| return 0; |
| } |
| |
| static inline void adreno_profile_preib_processing( |
| struct adreno_device *adreno_dev, |
| struct adreno_context *drawctxt, unsigned int *cmd_flags, |
| unsigned int **rbptr) { } |
| |
| static inline void adreno_profile_postib_processing( |
| struct adreno_device *adreno_dev, |
| unsigned int *cmd_flags, unsigned int **rbptr) { } |
| #endif |
| |
| static inline bool adreno_profile_enabled(struct adreno_profile *profile) |
| { |
| return profile->enabled; |
| } |
| |
| static inline bool adreno_profile_has_assignments( |
| struct adreno_profile *profile) |
| { |
| return list_empty(&profile->assignments_list) ? false : true; |
| } |
| |
| static inline bool adreno_profile_assignments_ready( |
| struct adreno_profile *profile) |
| { |
| return adreno_profile_enabled(profile) && |
| adreno_profile_has_assignments(profile); |
| } |
| |
| #endif |