android_kernel_samsung_msm8976/include/linux/msm_rtb.h
Subbaraman Narayanamurthy 2931ae16de ARM: gic: Add support for logging interrupts in RTB
To help with the debug of interrupt storms and problems during IRQ
handling, log the IRQ number in RTB for each interrupt that fires.

Change-Id: Icea5ded0f7d66ba3c7608793e7c25218e2a64e0c
Signed-off-by: Subbaraman Narayanamurthy <subbaram@codeaurora.org>
2014-06-09 11:34:38 -07:00

84 lines
2 KiB
C

/*
* Copyright (c) 2012-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 __MSM_RTB_H__
#define __MSM_RTB_H__
/*
* These numbers are used from the kernel command line and sysfs
* to control filtering. Remove items from here with extreme caution.
*/
enum logk_event_type {
LOGK_NONE = 0,
LOGK_READL = 1,
LOGK_WRITEL = 2,
LOGK_LOGBUF = 3,
LOGK_HOTPLUG = 4,
LOGK_CTXID = 5,
LOGK_TIMESTAMP = 6,
LOGK_L2CPREAD = 7,
LOGK_L2CPWRITE = 8,
LOGK_IRQ = 9,
};
#define LOGTYPE_NOPC 0x80
struct msm_rtb_platform_data {
unsigned int size;
};
#if defined(CONFIG_MSM_RTB)
/*
* returns 1 if data was logged, 0 otherwise
*/
int uncached_logk_pc(enum logk_event_type log_type, void *caller,
void *data);
/*
* returns 1 if data was logged, 0 otherwise
*/
int uncached_logk(enum logk_event_type log_type, void *data);
#define ETB_WAYPOINT do { \
BRANCH_TO_NEXT_ISTR; \
nop(); \
BRANCH_TO_NEXT_ISTR; \
nop(); \
} while (0)
#define BRANCH_TO_NEXT_ISTR asm volatile("b .+4\n" : : : "memory")
/*
* both the mb and the isb are needed to ensure enough waypoints for
* etb tracing
*/
#define LOG_BARRIER do { \
mb(); \
isb();\
} while (0)
#else
static inline int uncached_logk_pc(enum logk_event_type log_type,
void *caller,
void *data) { return 0; }
static inline int uncached_logk(enum logk_event_type log_type,
void *data) { return 0; }
#define ETB_WAYPOINT
#define BRANCH_TO_NEXT_ISTR
/*
* Due to a GCC bug, we need to have a nop here in order to prevent an extra
* read from being generated after the write.
*/
#define LOG_BARRIER nop()
#endif
#endif