rk29: vpu_mem: add debug_read function and some comments
author陈恒明 <chm@rockchip.com>
Wed, 20 Apr 2011 02:03:25 +0000 (10:03 +0800)
committer陈恒明 <chm@rockchip.com>
Tue, 24 May 2011 02:14:49 +0000 (10:14 +0800)
arch/arm/mach-rk29/vpu_mem.c

index 02efe074fcf5dbe5bec49f4fa7cab5f31a49307d..187c2a5248a99addb032aeae5bf03a0e648beff3 100644 (file)
 \r
 #include <mach/vpu_mem.h>\r
 \r
-#define VPU_MEM_MAX_ORDER               128\r
 #define VPU_MEM_MIN_ALLOC               PAGE_SIZE\r
+#define VPU_MEM_IS_PAGE_ALIGNED(addr)   (!((addr) & (~PAGE_MASK)))\r
 \r
 #define VPU_MEM_DEBUG                   0\r
 #define VPU_MEM_DEBUG_MSGS              0\r
 \r
-#define VPU_MEM_SPLIT_ALLOC             0\r
-#define VPU_MEM_SPLIT_LINK              1\r
-\r
 #if VPU_MEM_DEBUG_MSGS\r
 #define DLOG(fmt,args...) \\r
        do { printk(KERN_INFO "[%s:%s:%d] "fmt, __FILE__, __func__, __LINE__, \\r
 #define DLOG(x...) do {} while (0)\r
 #endif\r
 \r
-typedef enum vpu_mem_status {\r
-    VDM_FREE,\r
-    VDM_USED,\r
-    VDM_POST,\r
-    VDM_BUTT,\r
-} vdm_st;\r
-\r
 /**\r
  * struct for process session which connect to vpu_mem\r
  * \r
@@ -93,6 +83,9 @@ typedef struct vpu_mem_link_info {
     int pfn;\r
 } vdm_link;\r
 \r
+/**\r
+ * struct for global vpu memory info\r
+ */\r
 typedef struct vpu_mem_info {\r
        struct miscdevice dev;\r
        /* physical start address of the remaped vpu_mem space */\r
@@ -130,6 +123,12 @@ static int vpu_mem_over = 0;
 #define vdm_rwsem               (vpu_mem.rw_sem)\r
 #define is_free_region(x)       ((0 == (x)->used) && (0 == (x)->post))\r
 \r
+/**\r
+ * vpu memory info dump: \r
+ * first dump global info, then dump each session info \r
+ * \r
+ * @author ChenHengming (2011-4-20)\r
+ */\r
 static void dump_status(void)\r
 {\r
     vdm_link    *link, *tmp_link;\r
@@ -280,7 +279,14 @@ static int _insert_region_index(vdm_region *region)
     return -1;\r
 }\r
 \r
-static void _insert_region_status_free(vdm_link *link)\r
+/**\r
+ * insert a link into vdm_free list, indexed by vdm_link->index\r
+ * \r
+ * @author ChenHengming (2011-4-20)\r
+ * \r
+ * @param link \r
+ */\r
+static void _insert_link_status_free(vdm_link *link)\r
 {\r
     int index = link->index;\r
     int last = -1;\r
@@ -472,7 +478,7 @@ static void put_free_link(vdm_link *link)
 {\r
     list_del_init(&link->session_link);\r
     list_del_init(&link->status_link);\r
-    _insert_region_status_free(link);\r
+    _insert_link_status_free(link);\r
 }\r
 \r
 static void put_used_link(vdm_link *link, vdm_session *session)\r
@@ -491,6 +497,17 @@ static void put_post_link(vdm_link *link, vdm_session *session)
     _insert_link_session_post(link, session);\r
 }\r
 \r
+/**\r
+ * Create a link and a region by index and pfn at a same time, \r
+ * and connect the link with the region \r
+ * \r
+ * @author ChenHengming (2011-4-20)\r
+ * \r
+ * @param index \r
+ * @param pfn \r
+ * \r
+ * @return vdm_link* \r
+ */\r
 static vdm_link *new_link_by_index(int index, int pfn)\r
 {\r
     vdm_region *region = (vdm_region *)kmalloc(sizeof(vdm_region), GFP_KERNEL);\r
@@ -525,6 +542,16 @@ static vdm_link *new_link_by_index(int index, int pfn)
     return link;\r
 }\r
 \r
+/**\r
+ * Create a link from a already exist region and connect to the \r
+ * region \r
+ * \r
+ * @author ChenHengming (2011-4-20)\r
+ * \r
+ * @param region \r
+ * \r
+ * @return vdm_link* \r
+ */\r
 static vdm_link *new_link_by_region(vdm_region *region)\r
 {\r
     vdm_link *link = (vdm_link *)kmalloc(sizeof(vdm_link), GFP_KERNEL);\r
@@ -544,6 +571,13 @@ static vdm_link *new_link_by_region(vdm_region *region)
     return link;\r
 }\r
 \r
+/**\r
+ * Delete a link completely\r
+ * \r
+ * @author ChenHengming (2011-4-20)\r
+ * \r
+ * @param link \r
+ */\r
 static void link_del(vdm_link *link)\r
 {\r
     list_del_init(&link->session_link);\r
@@ -551,6 +585,18 @@ static void link_del(vdm_link *link)
     kfree(link);\r
 }\r
 \r
+/**\r
+ * Called by malloc, check whether a free link can by used for a \r
+ * len of pfn, if can then put a used link to status link \r
+ * \r
+ * @author ChenHengming (2011-4-20)\r
+ * \r
+ * @param link \r
+ * @param session \r
+ * @param pfn \r
+ * \r
+ * @return vdm_link* \r
+ */\r
 static vdm_link *get_used_link_from_free_link(vdm_link *link, vdm_session *session, int pfn)\r
 {\r
     if (pfn > link->pfn) {\r
@@ -591,8 +637,6 @@ static vdm_link *get_used_link_from_free_link(vdm_link *link, vdm_session *sessi
     }\r
 }\r
 \r
-#define VPU_MEM_IS_PAGE_ALIGNED(addr) (!((addr) & (~PAGE_MASK)))\r
-\r
 static int vpu_mem_release(struct inode *, struct file *);\r
 static int vpu_mem_mmap(struct file *, struct vm_area_struct *);\r
 static int vpu_mem_open(struct inode *, struct file *);\r
@@ -630,11 +674,12 @@ static long vpu_mem_allocate(struct file *file, unsigned int len)
         /* find match free buffer use it first */\r
         vdm_link *used = get_used_link_from_free_link(free, session, pfn);\r
         DLOG("search free buffer at index %d pfn %d for len %d\n", free->index, free->pfn, pfn);\r
-        DLOG("found buffer at index %d pfn %d for ptr %x\n", used->index, used->pfn, used);\r
-        if (NULL == used)\r
+        if (NULL == used) {\r
             continue;\r
-        else\r
+        } else {\r
+            DLOG("found buffer at index %d pfn %d for ptr %x\n", used->index, used->pfn, used);\r
             return used->index;\r
+        }\r
     }\r
 \r
        if (!vpu_mem_over) {\r
@@ -1017,41 +1062,24 @@ static ssize_t debug_open(struct inode *inode, struct file *file)
 static ssize_t debug_read(struct file *file, char __user *buf, size_t count,\r
                          loff_t *ppos)\r
 {\r
-#if 0\r
-       struct list_head *elt, *elt2;\r
-       struct vpu_mem_info *data;\r
+       vdm_region *region, *tmp_region;\r
        const int debug_bufmax = 4096;\r
        static char buffer[4096];\r
        int n = 0;\r
 \r
        DLOG("debug open\n");\r
        n = scnprintf(buffer, debug_bufmax,\r
-                     "pid #: mapped regions (offset, len) (offset,len)...\n");\r
+                     "pid #: mapped regions (offset, len, used, post) ...\n");\r
        down_read(&vdm_rwsem);\r
-       list_for_each(elt, &vpu_mem.data_list) {\r
-               data = list_entry(elt, struct vpu_mem_info, list);\r
-               down_read(&data->sem);\r
-               n += scnprintf(buffer + n, debug_bufmax - n, "pid %u:",\r
-                               data->pid);\r
-               list_for_each(elt2, &data->region_list) {\r
-                       region_node = list_entry(elt2, struct vpu_mem_region_node,\r
-                                     list);\r
-                       n += scnprintf(buffer + n, debug_bufmax - n,\r
-                                       "(%d,%d) ",\r
-                                       region_node->region.index,\r
-                                       region_node->region.ref_count);\r
-               }\r
-               n += scnprintf(buffer + n, debug_bufmax - n, "\n");\r
-               up_read(&data->sem);\r
+    list_for_each_entry_safe(region, tmp_region, &vdm_index, index_list) {\r
+        n += scnprintf(buffer + n, debug_bufmax - n,\r
+                "(%d,%d,%d,%d) ",\r
+                region->index, region->pfn, region->used, region->post);\r
        }\r
-\r
        up_read(&vdm_rwsem);\r
        n++;\r
        buffer[n] = 0;\r
        return simple_read_from_buffer(buf, count, ppos, buffer, n);\r
-#else\r
-    return 0;\r
-#endif\r
 }\r
 \r
 static struct file_operations debug_fops = {\r