blob: 49f935d2c3e9b65094979d2af0d3631b3696dea3 [file] [log] [blame]
/*
* This file is part of the Chelsio T3 Ethernet driver for Linux.
*
* Copyright (C) 2003-2009 Chelsio Communications. All rights reserved.
*
* 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 LICENSE file included in this
* release for licensing terms and conditions.
*/
/*
* Definitions and inline functions for the T3 trace buffers.
*
* Authors:
* Felix Marti <felix@chelsio.com>
*/
#ifndef __T3_TRACE_H__
#define __T3_TRACE_H__
#if defined(T3_TRACE) || defined(T3_TRACE_TOM)
#include <linux/time.h>
#include <linux/timex.h>
#define T3_TRACE_NUM_PARAM 6
typedef unsigned long tracearg_t;
#define T3_TRACE0(b, s) \
if ((b) != NULL) \
(void) t3_trace((b), (s));
#define T3_TRACE1(b, s, p0) \
if ((b) != NULL) { \
tracearg_t *_p = t3_trace((b), (s)); \
_p[0] = (tracearg_t) (p0); \
}
#define T3_TRACE2(b, s, p0, p1) \
if ((b) != NULL) { \
tracearg_t *_p = t3_trace((b), (s)); \
_p[0] = (tracearg_t) (p0); \
_p[1] = (tracearg_t) (p1); \
}
#define T3_TRACE3(b, s, p0, p1, p2) \
if ((b) != NULL) { \
tracearg_t *_p = t3_trace((b), (s)); \
_p[0] = (tracearg_t) (p0); \
_p[1] = (tracearg_t) (p1); \
_p[2] = (tracearg_t) (p2); \
}
#define T3_TRACE4(b, s, p0, p1, p2, p3) \
if ((b) != NULL) { \
tracearg_t *_p = t3_trace((b), (s)); \
_p[0] = (tracearg_t) (p0); \
_p[1] = (tracearg_t) (p1); \
_p[2] = (tracearg_t) (p2); \
_p[3] = (tracearg_t) (p3); \
}
#define T3_TRACE5(b, s, p0, p1, p2, p3, p4) \
if ((b) != NULL) { \
tracearg_t *_p = t3_trace((b), (s)); \
_p[0] = (tracearg_t) (p0); \
_p[1] = (tracearg_t) (p1); \
_p[2] = (tracearg_t) (p2); \
_p[3] = (tracearg_t) (p3); \
_p[4] = (tracearg_t) (p4); \
}
#define T3_TRACE6(b, s, p0, p1, p2, p3, p4, p5) \
if ((b) != NULL) { \
tracearg_t *_p = t3_trace((b), (s)); \
_p[0] = (tracearg_t) (p0); \
_p[1] = (tracearg_t) (p1); \
_p[2] = (tracearg_t) (p2); \
_p[3] = (tracearg_t) (p3); \
_p[4] = (tracearg_t) (p4); \
_p[5] = (tracearg_t) (p5); \
}
struct trace_entry {
cycles_t tsc;
char *fmt;
tracearg_t param[T3_TRACE_NUM_PARAM];
};
struct dentry;
struct trace_buf {
unsigned int capacity; /* size of ring buffer */
unsigned int idx; /* index of next entry to write */
struct dentry *debugfs_dentry;
struct trace_entry ep[0]; /* the ring buffer */
};
static inline unsigned long *t3_trace(struct trace_buf *tb, char *fmt)
{
struct trace_entry *ep = &tb->ep[tb->idx++ & (tb->capacity - 1)];
ep->fmt = fmt;
ep->tsc = get_cycles();
return (unsigned long *) &ep->param[0];
}
struct trace_buf *t3_trace_alloc(struct dentry *root, const char *name,
unsigned int capacity);
void t3_trace_free(struct trace_buf *tb);
#else
#define T3_TRACE0(b, s)
#define T3_TRACE1(b, s, p0)
#define T3_TRACE2(b, s, p0, p1)
#define T3_TRACE3(b, s, p0, p1, p2)
#define T3_TRACE4(b, s, p0, p1, p2, p3)
#define T3_TRACE5(b, s, p0, p1, p2, p3, p4)
#define T3_TRACE6(b, s, p0, p1, p2, p3, p4, p5)
#define t3_trace_alloc(root, name, capacity) NULL
#define t3_trace_free(tb)
#endif
#endif /* __T3_TRACE_H__ */