1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * (C) COPYRIGHT 2015-2016 ARM Limited. All rights reserved. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software and is provided to you under the terms of the 6*4882a593Smuzhiyun * GNU General Public License version 2 as published by the Free Software 7*4882a593Smuzhiyun * Foundation, and any use by you of this program is subject to the terms 8*4882a593Smuzhiyun * of such GNU licence. 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * A copy of the licence is included with the program, and can also be obtained 11*4882a593Smuzhiyun * from Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 12*4882a593Smuzhiyun * Boston, MA 02110-1301, USA. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun */ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun #ifndef _KBASE_VINSTR_H_ 19*4882a593Smuzhiyun #define _KBASE_VINSTR_H_ 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun #include <mali_kbase.h> 22*4882a593Smuzhiyun #include <mali_kbase_hwcnt_reader.h> 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun /*****************************************************************************/ 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct kbase_vinstr_context; 27*4882a593Smuzhiyun struct kbase_vinstr_client; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /*****************************************************************************/ 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun /** 32*4882a593Smuzhiyun * kbase_vinstr_init() - initialize the vinstr core 33*4882a593Smuzhiyun * @kbdev: kbase device 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * Return: pointer to the vinstr context on success or NULL on failure 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun struct kbase_vinstr_context *kbase_vinstr_init(struct kbase_device *kbdev); 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /** 40*4882a593Smuzhiyun * kbase_vinstr_term() - terminate the vinstr core 41*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 42*4882a593Smuzhiyun */ 43*4882a593Smuzhiyun void kbase_vinstr_term(struct kbase_vinstr_context *vinstr_ctx); 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun /** 46*4882a593Smuzhiyun * kbase_vinstr_hwcnt_reader_setup - configure hw counters reader 47*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 48*4882a593Smuzhiyun * @setup: reader's configuration 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * Return: zero on success 51*4882a593Smuzhiyun */ 52*4882a593Smuzhiyun int kbase_vinstr_hwcnt_reader_setup( 53*4882a593Smuzhiyun struct kbase_vinstr_context *vinstr_ctx, 54*4882a593Smuzhiyun struct kbase_uk_hwcnt_reader_setup *setup); 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun /** 57*4882a593Smuzhiyun * kbase_vinstr_legacy_hwc_setup - configure hw counters for dumping 58*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 59*4882a593Smuzhiyun * @cli: pointer where to store pointer to new vinstr client structure 60*4882a593Smuzhiyun * @setup: hwc configuration 61*4882a593Smuzhiyun * 62*4882a593Smuzhiyun * Return: zero on success 63*4882a593Smuzhiyun */ 64*4882a593Smuzhiyun int kbase_vinstr_legacy_hwc_setup( 65*4882a593Smuzhiyun struct kbase_vinstr_context *vinstr_ctx, 66*4882a593Smuzhiyun struct kbase_vinstr_client **cli, 67*4882a593Smuzhiyun struct kbase_uk_hwcnt_setup *setup); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /** 70*4882a593Smuzhiyun * kbase_vinstr_hwcnt_kernel_setup - configure hw counters for kernel side 71*4882a593Smuzhiyun * client 72*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 73*4882a593Smuzhiyun * @setup: reader's configuration 74*4882a593Smuzhiyun * @kernel_buffer: pointer to dump buffer 75*4882a593Smuzhiyun * 76*4882a593Smuzhiyun * setup->buffer_count and setup->fd are not used for kernel side clients. 77*4882a593Smuzhiyun * 78*4882a593Smuzhiyun * Return: pointer to client structure, or NULL on failure 79*4882a593Smuzhiyun */ 80*4882a593Smuzhiyun struct kbase_vinstr_client *kbase_vinstr_hwcnt_kernel_setup( 81*4882a593Smuzhiyun struct kbase_vinstr_context *vinstr_ctx, 82*4882a593Smuzhiyun struct kbase_uk_hwcnt_reader_setup *setup, 83*4882a593Smuzhiyun void *kernel_buffer); 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /** 86*4882a593Smuzhiyun * kbase_vinstr_hwc_dump - issue counter dump for vinstr client 87*4882a593Smuzhiyun * @cli: pointer to vinstr client 88*4882a593Smuzhiyun * @event_id: id of event that triggered hwcnt dump 89*4882a593Smuzhiyun * 90*4882a593Smuzhiyun * Return: zero on success 91*4882a593Smuzhiyun */ 92*4882a593Smuzhiyun int kbase_vinstr_hwc_dump( 93*4882a593Smuzhiyun struct kbase_vinstr_client *cli, 94*4882a593Smuzhiyun enum base_hwcnt_reader_event event_id); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun /** 97*4882a593Smuzhiyun * kbase_vinstr_hwc_clear - performs a reset of the hardware counters for 98*4882a593Smuzhiyun * a given kbase context 99*4882a593Smuzhiyun * @cli: pointer to vinstr client 100*4882a593Smuzhiyun * 101*4882a593Smuzhiyun * Return: zero on success 102*4882a593Smuzhiyun */ 103*4882a593Smuzhiyun int kbase_vinstr_hwc_clear(struct kbase_vinstr_client *cli); 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun /** 106*4882a593Smuzhiyun * kbase_vinstr_try_suspend - try suspending operation of a given vinstr context 107*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 108*4882a593Smuzhiyun * 109*4882a593Smuzhiyun * Return: 0 on success, or negative if state change is in progress 110*4882a593Smuzhiyun * 111*4882a593Smuzhiyun * Warning: This API call is non-generic. It is meant to be used only by 112*4882a593Smuzhiyun * job scheduler state machine. 113*4882a593Smuzhiyun * 114*4882a593Smuzhiyun * Function initiates vinstr switch to suspended state. Once it was called 115*4882a593Smuzhiyun * vinstr enters suspending state. If function return non-zero value, it 116*4882a593Smuzhiyun * indicates that state switch is not complete and function must be called 117*4882a593Smuzhiyun * again. On state switch vinstr will trigger job scheduler state machine 118*4882a593Smuzhiyun * cycle. 119*4882a593Smuzhiyun */ 120*4882a593Smuzhiyun int kbase_vinstr_try_suspend(struct kbase_vinstr_context *vinstr_ctx); 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /** 123*4882a593Smuzhiyun * kbase_vinstr_suspend - suspends operation of a given vinstr context 124*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 125*4882a593Smuzhiyun * 126*4882a593Smuzhiyun * Function initiates vinstr switch to suspended state. Then it blocks until 127*4882a593Smuzhiyun * operation is completed. 128*4882a593Smuzhiyun */ 129*4882a593Smuzhiyun void kbase_vinstr_suspend(struct kbase_vinstr_context *vinstr_ctx); 130*4882a593Smuzhiyun 131*4882a593Smuzhiyun /** 132*4882a593Smuzhiyun * kbase_vinstr_resume - resumes operation of a given vinstr context 133*4882a593Smuzhiyun * @vinstr_ctx: vinstr context 134*4882a593Smuzhiyun * 135*4882a593Smuzhiyun * Function can be called only if it was preceded by a successful call 136*4882a593Smuzhiyun * to kbase_vinstr_suspend. 137*4882a593Smuzhiyun */ 138*4882a593Smuzhiyun void kbase_vinstr_resume(struct kbase_vinstr_context *vinstr_ctx); 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /** 141*4882a593Smuzhiyun * kbase_vinstr_dump_size - Return required size of dump buffer 142*4882a593Smuzhiyun * @kbdev: device pointer 143*4882a593Smuzhiyun * 144*4882a593Smuzhiyun * Return : buffer size in bytes 145*4882a593Smuzhiyun */ 146*4882a593Smuzhiyun size_t kbase_vinstr_dump_size(struct kbase_device *kbdev); 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun /** 149*4882a593Smuzhiyun * kbase_vinstr_detach_client - Detach a client from the vinstr core 150*4882a593Smuzhiyun * @cli: pointer to vinstr client 151*4882a593Smuzhiyun */ 152*4882a593Smuzhiyun void kbase_vinstr_detach_client(struct kbase_vinstr_client *cli); 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #endif /* _KBASE_VINSTR_H_ */ 155*4882a593Smuzhiyun 156