| /* |
| * Copyright (C) 2001 Broadcom Corporation |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| * |
| * 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. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
| */ |
| |
| #ifndef __ASM_SIBYTE_TRACE_PROF_H |
| #define __ASM_SIBYTE_TRACE_PROF_H |
| |
| #undef DBG |
| #if SBPROF_TB_DEBUG |
| #define DBG(a) a |
| #else |
| #define DBG(a) |
| #endif |
| |
| #define SBPROF_TB_MAJOR 240 |
| #define DEVNAME "bcm1250_tbprof" |
| |
| typedef u_int64_t tb_sample_t[6*256]; |
| |
| struct sbprof_tb { |
| int open; |
| tb_sample_t *sbprof_tbbuf; |
| int next_tb_sample; |
| |
| volatile int tb_enable; |
| volatile int tb_armed; |
| |
| wait_queue_head_t tb_sync; |
| wait_queue_head_t tb_read; |
| }; |
| |
| #define MAX_SAMPLE_BYTES (24*1024*1024) |
| #define MAX_TBSAMPLE_BYTES (12*1024*1024) |
| |
| #define MAX_SAMPLES (MAX_SAMPLE_BYTES/sizeof(u_int32_t)) |
| #define TB_SAMPLE_SIZE (sizeof(tb_sample_t)) |
| #define MAX_TB_SAMPLES (MAX_TBSAMPLE_BYTES/TB_SAMPLE_SIZE) |
| |
| /* IOCTLs */ |
| #define SBPROF_ZBSTART _IOW('s', 0, int) |
| #define SBPROF_ZBSTOP _IOW('s', 1, int) |
| #define SBPROF_ZBWAITFULL _IOW('s', 2, int) |
| |
| /*************************************************************************** |
| * Routines for gathering ZBbus profiles using trace buffer |
| ***************************************************************************/ |
| |
| /* Requires: Already called zclk_timer_init with a value that won't |
| saturate 40 bits. No subsequent use of SCD performance counters |
| or trace buffer. |
| Effect: Starts gathering random ZBbus profiles using trace buffer. */ |
| extern int sbprof_zbprof_start(struct file *filp); |
| |
| /* Effect: Stops collection of ZBbus profiles */ |
| extern int sbprof_zbprof_stop(void); |
| |
| |
| /*************************************************************************** |
| * Routines for using 40-bit SCD cycle counter |
| * |
| * Client responsible for either handling interrupts or making sure |
| * the cycles counter never saturates, e.g., by doing |
| * zclk_timer_init(0) at least every 2^40 - 1 ZCLKs. |
| ***************************************************************************/ |
| |
| /* Configures SCD counter 0 to count ZCLKs starting from val; |
| Configures SCD counters1,2,3 to count nothing. |
| Must not be called while gathering ZBbus profiles. |
| |
| unsigned long long val; */ |
| #define zclk_timer_init(val) \ |
| __asm__ __volatile__ (".set push;" \ |
| ".set mips64;" \ |
| "la $8, 0xb00204c0;" /* SCD perf_cnt_cfg */ \ |
| "sd %0, 0x10($8);" /* write val to counter0 */ \ |
| "sd %1, 0($8);" /* config counter0 for zclks*/ \ |
| ".set pop" \ |
| : /* no outputs */ \ |
| /* enable, counter0 */ \ |
| : /* inputs */ "r"(val), "r" ((1ULL << 33) | 1ULL) \ |
| : /* modifies */ "$8" ) |
| |
| |
| /* Reads SCD counter 0 and puts result in value |
| unsigned long long val; */ |
| #define zclk_get(val) \ |
| __asm__ __volatile__ (".set push;" \ |
| ".set mips64;" \ |
| "la $8, 0xb00204c0;" /* SCD perf_cnt_cfg */ \ |
| "ld %0, 0x10($8);" /* write val to counter0 */ \ |
| ".set pop" \ |
| : /* outputs */ "=r"(val) \ |
| : /* inputs */ \ |
| : /* modifies */ "$8" ) |
| |
| #endif /* __ASM_SIBYTE_TRACE_PROF_H */ |