From: Imre Deak Date: Tue, 14 Dec 2010 00:54:24 +0000 (+0200) Subject: gpu: pvr: add debugfs entry to read the EDM trace X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=933ad63064d301158daf77c6effd554082e6aa97;p=sgx.git gpu: pvr: add debugfs entry to read the EDM trace Signed-off-by: Imre Deak --- diff --git a/pvr/pvr_debug.c b/pvr/pvr_debug.c index 0f49175..1c89499 100644 --- a/pvr/pvr_debug.c +++ b/pvr/pvr_debug.c @@ -32,6 +32,8 @@ #include #include #include +#include + #include #include "img_types.h" #include "servicesext.h" @@ -325,6 +327,54 @@ static int pvr_dbg_set(void *data, u64 val) DEFINE_SIMPLE_ATTRIBUTE(pvr_dbg_fops, NULL, pvr_dbg_set, "%llu\n"); +struct edm_buf_info { + size_t len; + char data[1]; +}; + +static int pvr_dbg_edm_open(struct inode *inode, struct file *file) +{ + struct PVRSRV_DEVICE_NODE *node; + struct PVRSRV_SGXDEV_INFO *sgx_info; + struct edm_buf_info *bi; + size_t size; + + /* Take a snapshot of the EDM trace buffer */ + size = SGXMK_TRACE_BUFFER_SIZE * SGXMK_TRACE_BUF_STR_LEN; + bi = vmalloc(sizeof(*bi) + size); + if (!bi) + return -ENOMEM; + + node = get_sgx_node(); + sgx_info = node->pvDevice; + bi->len = snprint_edm_trace(sgx_info, bi->data, size); + file->private_data = bi; + + return 0; +} + +static int pvr_dbg_edm_release(struct inode *inode, struct file *file) +{ + vfree(file->private_data); + + return 0; +} + +static ssize_t pvr_dbg_edm_read(struct file *file, char __user *buffer, + size_t count, loff_t *ppos) +{ + struct edm_buf_info *bi = file->private_data; + + return simple_read_from_buffer(buffer, count, ppos, bi->data, bi->len); +} + +static const struct file_operations pvr_dbg_edm_fops = { + .owner = THIS_MODULE, + .open = pvr_dbg_edm_open, + .read = pvr_dbg_edm_read, + .release = pvr_dbg_edm_release, +}; + static int pvr_init_debugfs(void) { debugfs_dir = debugfs_create_dir("pvr", NULL); @@ -337,6 +387,12 @@ static int pvr_init_debugfs(void) return -ENODEV; } + if (!debugfs_create_file("edm_trace", S_IRUGO, debugfs_dir, NULL, + &pvr_dbg_edm_fops)) { + debugfs_remove_recursive(debugfs_dir); + return -ENODEV; + } + return 0; }