| /* Copyright (c) 2012-2013, 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 _IPC_LOGGING_H |
| #define _IPC_LOGGING_H |
| |
| struct ipc_log_page_header { |
| uint32_t magic; |
| uint32_t nmagic; /* inverse of magic number */ |
| uint32_t log_id; /* owner of log */ |
| uint32_t page_num; |
| uint16_t read_offset; |
| uint16_t write_offset; |
| struct list_head list; |
| }; |
| |
| struct ipc_log_page { |
| struct ipc_log_page_header hdr; |
| char data[PAGE_SIZE - sizeof(struct ipc_log_page_header)]; |
| }; |
| |
| struct ipc_log_context { |
| struct list_head list; |
| struct list_head page_list; |
| struct ipc_log_page *first_page; |
| struct ipc_log_page *last_page; |
| struct ipc_log_page *write_page; |
| struct ipc_log_page *read_page; |
| uint32_t write_avail; |
| struct dentry *dent; |
| struct list_head dfunc_info_list; |
| spinlock_t ipc_log_context_lock; |
| struct completion read_avail; |
| }; |
| |
| struct dfunc_info { |
| struct list_head list; |
| int type; |
| void (*dfunc) (struct encode_context *, struct decode_context *); |
| }; |
| |
| enum { |
| TSV_TYPE_INVALID, |
| TSV_TYPE_TIMESTAMP, |
| TSV_TYPE_POINTER, |
| TSV_TYPE_INT32, |
| TSV_TYPE_BYTE_ARRAY, |
| }; |
| |
| enum { |
| OUTPUT_DEBUGFS, |
| }; |
| |
| #define IPC_LOGGING_MAGIC_NUM 0x52784425 |
| #define MIN(x, y) ((x) < (y) ? (x) : (y)) |
| #define IS_MSG_TYPE(x) (((x) > TSV_TYPE_MSG_START) && \ |
| ((x) < TSV_TYPE_MSG_END)) |
| |
| extern rwlock_t ipc_log_context_list_lock; |
| |
| extern int msg_read(struct ipc_log_context *ilctxt, |
| struct encode_context *ectxt); |
| |
| static inline int is_ilctxt_empty(struct ipc_log_context *ilctxt) |
| { |
| if (!ilctxt) |
| return -EINVAL; |
| |
| return ((ilctxt->read_page == ilctxt->write_page) && |
| (ilctxt->read_page->hdr.read_offset == |
| ilctxt->write_page->hdr.write_offset)); |
| } |
| |
| #if (defined(CONFIG_DEBUG_FS)) |
| void check_and_create_debugfs(void); |
| |
| void create_ctx_debugfs(struct ipc_log_context *ctxt, |
| const char *mod_name); |
| #else |
| void check_and_create_debugfs(void) |
| { |
| } |
| |
| void create_ctx_debugfs(struct ipc_log_context *ctxt, const char *mod_name) |
| { |
| } |
| #endif |
| |
| #endif |