rk29: vpu_mem: add /proc/vpu_mem module
author陈恒明 <chm@rock-chips.com>
Tue, 14 Dec 2010 06:20:01 +0000 (22:20 -0800)
committer陈恒明 <chm@rock-chips.com>
Tue, 14 Dec 2010 06:20:01 +0000 (22:20 -0800)
arch/arm/mach-rk29/vpu_mem.c

index a15e2bab24e8cac4c787ea657a61a4224a150b28..c88cbadd7471b79f355a9330b1f0cccfc91223bf 100644 (file)
@@ -958,4 +958,74 @@ static void __exit vpu_mem_exit(void)
 module_init(vpu_mem_init);\r
 module_exit(vpu_mem_exit);\r
 \r
+#ifdef CONFIG_PROC_FS\r
+#include <linux/proc_fs.h>\r
+#include <linux/seq_file.h>\r
+\r
+static int proc_vpu_mem_show(struct seq_file *s, void *v)\r
+{\r
+       unsigned int i;\r
+\r
+       if (vpu_mem.bitmap) {\r
+               seq_printf(s, "vpu mem opened\n");\r
+       } else {\r
+               seq_printf(s, "vpu mem closed\n");\r
+        return 0;\r
+       }\r
+\r
+    down_read(&vpu_mem.bitmap_sem);\r
+    {\r
+        // ´òÓ¡ bitmap ÖеÄÈ«²¿ region\r
+        for (i = 0; i < vpu_mem.num_entries; i = VPU_MEM_NEXT_INDEX(i)) {\r
+            region_check(i);\r
+            seq_printf(s, "vpu_mem: idx %6d pfn %6d refc %3d avail %3d\n",\r
+                i, VPU_MEM_PFN(i), VPU_MEM_REFC(i), VPU_MEM_AVAIL(i));\r
+        }\r
+\r
+        // ´òÓ¡ vpu_mem_data ÖеÄÈ«²¿ region\r
+        down(&vpu_mem.data_list_sem);\r
+        {   // search exists index\r
+            struct list_head *list, *tmp_list;\r
+            list_for_each_safe(list, tmp_list, &vpu_mem.data_list) {\r
+                struct list_head *region, *tmp_data;\r
+                struct vpu_mem_data *data = list_entry(list, struct vpu_mem_data, list);\r
+\r
+                seq_printf(s, "pid: %d\n", data->pid);\r
+\r
+                down_read(&data->sem);\r
+                list_for_each_safe(region, tmp_data, &data->region_list) {\r
+                    struct vpu_mem_region_node *node = list_entry(region, struct vpu_mem_region_node, list);\r
+                    i = node->region.index;\r
+                    seq_printf(s, "    region: idx %6d pfn %6d refc %3d avail %3d ref by %d\n",\r
+                        i, VPU_MEM_PFN(i), VPU_MEM_REFC(i), VPU_MEM_AVAIL(i), node->region.ref_count);\r
+                }\r
+                up_read(&data->sem);\r
+            }\r
+        }\r
+        up(&vpu_mem.data_list_sem);\r
+    }\r
+    up_read(&vpu_mem.bitmap_sem);\r
+       return 0;\r
+}\r
+\r
+static int proc_vpu_mem_open(struct inode *inode, struct file *file)\r
+{\r
+       return single_open(file, proc_vpu_mem_show, NULL);\r
+}\r
+\r
+static const struct file_operations proc_vpu_mem_fops = {\r
+       .open           = proc_vpu_mem_open,\r
+       .read           = seq_read,\r
+       .llseek         = seq_lseek,\r
+       .release        = single_release,\r
+};\r
+\r
+static int __init vpu_mem_proc_init(void)\r
+{\r
+       proc_create("vpu_mem", 0, NULL, &proc_vpu_mem_fops);\r
+       return 0;\r
+\r
+}\r
+late_initcall(vpu_mem_proc_init);\r
+#endif /* CONFIG_PROC_FS */\r
 \r