From 566ff924d0380c98cc2be2f2669750f2e4b8b10f Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=99=88=E6=81=92=E6=98=8E?= Date: Wed, 20 Apr 2011 10:03:25 +0800 Subject: [PATCH] rk29: vpu_mem: add debug_read function and some comments --- arch/arm/mach-rk29/vpu_mem.c | 110 ++++++++++++++++++++++------------- 1 file changed, 69 insertions(+), 41 deletions(-) diff --git a/arch/arm/mach-rk29/vpu_mem.c b/arch/arm/mach-rk29/vpu_mem.c index 02efe074fcf5..187c2a5248a9 100644 --- a/arch/arm/mach-rk29/vpu_mem.c +++ b/arch/arm/mach-rk29/vpu_mem.c @@ -28,15 +28,12 @@ #include -#define VPU_MEM_MAX_ORDER 128 #define VPU_MEM_MIN_ALLOC PAGE_SIZE +#define VPU_MEM_IS_PAGE_ALIGNED(addr) (!((addr) & (~PAGE_MASK))) #define VPU_MEM_DEBUG 0 #define VPU_MEM_DEBUG_MSGS 0 -#define VPU_MEM_SPLIT_ALLOC 0 -#define VPU_MEM_SPLIT_LINK 1 - #if VPU_MEM_DEBUG_MSGS #define DLOG(fmt,args...) \ do { printk(KERN_INFO "[%s:%s:%d] "fmt, __FILE__, __func__, __LINE__, \ @@ -46,13 +43,6 @@ #define DLOG(x...) do {} while (0) #endif -typedef enum vpu_mem_status { - VDM_FREE, - VDM_USED, - VDM_POST, - VDM_BUTT, -} vdm_st; - /** * struct for process session which connect to vpu_mem * @@ -93,6 +83,9 @@ typedef struct vpu_mem_link_info { int pfn; } vdm_link; +/** + * struct for global vpu memory info + */ typedef struct vpu_mem_info { struct miscdevice dev; /* physical start address of the remaped vpu_mem space */ @@ -130,6 +123,12 @@ static int vpu_mem_over = 0; #define vdm_rwsem (vpu_mem.rw_sem) #define is_free_region(x) ((0 == (x)->used) && (0 == (x)->post)) +/** + * vpu memory info dump: + * first dump global info, then dump each session info + * + * @author ChenHengming (2011-4-20) + */ static void dump_status(void) { vdm_link *link, *tmp_link; @@ -280,7 +279,14 @@ static int _insert_region_index(vdm_region *region) return -1; } -static void _insert_region_status_free(vdm_link *link) +/** + * insert a link into vdm_free list, indexed by vdm_link->index + * + * @author ChenHengming (2011-4-20) + * + * @param link + */ +static void _insert_link_status_free(vdm_link *link) { int index = link->index; int last = -1; @@ -472,7 +478,7 @@ static void put_free_link(vdm_link *link) { list_del_init(&link->session_link); list_del_init(&link->status_link); - _insert_region_status_free(link); + _insert_link_status_free(link); } static void put_used_link(vdm_link *link, vdm_session *session) @@ -491,6 +497,17 @@ static void put_post_link(vdm_link *link, vdm_session *session) _insert_link_session_post(link, session); } +/** + * Create a link and a region by index and pfn at a same time, + * and connect the link with the region + * + * @author ChenHengming (2011-4-20) + * + * @param index + * @param pfn + * + * @return vdm_link* + */ static vdm_link *new_link_by_index(int index, int pfn) { vdm_region *region = (vdm_region *)kmalloc(sizeof(vdm_region), GFP_KERNEL); @@ -525,6 +542,16 @@ static vdm_link *new_link_by_index(int index, int pfn) return link; } +/** + * Create a link from a already exist region and connect to the + * region + * + * @author ChenHengming (2011-4-20) + * + * @param region + * + * @return vdm_link* + */ static vdm_link *new_link_by_region(vdm_region *region) { vdm_link *link = (vdm_link *)kmalloc(sizeof(vdm_link), GFP_KERNEL); @@ -544,6 +571,13 @@ static vdm_link *new_link_by_region(vdm_region *region) return link; } +/** + * Delete a link completely + * + * @author ChenHengming (2011-4-20) + * + * @param link + */ static void link_del(vdm_link *link) { list_del_init(&link->session_link); @@ -551,6 +585,18 @@ static void link_del(vdm_link *link) kfree(link); } +/** + * Called by malloc, check whether a free link can by used for a + * len of pfn, if can then put a used link to status link + * + * @author ChenHengming (2011-4-20) + * + * @param link + * @param session + * @param pfn + * + * @return vdm_link* + */ static vdm_link *get_used_link_from_free_link(vdm_link *link, vdm_session *session, int pfn) { if (pfn > link->pfn) { @@ -591,8 +637,6 @@ static vdm_link *get_used_link_from_free_link(vdm_link *link, vdm_session *sessi } } -#define VPU_MEM_IS_PAGE_ALIGNED(addr) (!((addr) & (~PAGE_MASK))) - static int vpu_mem_release(struct inode *, struct file *); static int vpu_mem_mmap(struct file *, struct vm_area_struct *); static int vpu_mem_open(struct inode *, struct file *); @@ -630,11 +674,12 @@ static long vpu_mem_allocate(struct file *file, unsigned int len) /* find match free buffer use it first */ vdm_link *used = get_used_link_from_free_link(free, session, pfn); DLOG("search free buffer at index %d pfn %d for len %d\n", free->index, free->pfn, pfn); - DLOG("found buffer at index %d pfn %d for ptr %x\n", used->index, used->pfn, used); - if (NULL == used) + if (NULL == used) { continue; - else + } else { + DLOG("found buffer at index %d pfn %d for ptr %x\n", used->index, used->pfn, used); return used->index; + } } if (!vpu_mem_over) { @@ -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, loff_t *ppos) { -#if 0 - struct list_head *elt, *elt2; - struct vpu_mem_info *data; + vdm_region *region, *tmp_region; const int debug_bufmax = 4096; static char buffer[4096]; int n = 0; DLOG("debug open\n"); n = scnprintf(buffer, debug_bufmax, - "pid #: mapped regions (offset, len) (offset,len)...\n"); + "pid #: mapped regions (offset, len, used, post) ...\n"); down_read(&vdm_rwsem); - list_for_each(elt, &vpu_mem.data_list) { - data = list_entry(elt, struct vpu_mem_info, list); - down_read(&data->sem); - n += scnprintf(buffer + n, debug_bufmax - n, "pid %u:", - data->pid); - list_for_each(elt2, &data->region_list) { - region_node = list_entry(elt2, struct vpu_mem_region_node, - list); - n += scnprintf(buffer + n, debug_bufmax - n, - "(%d,%d) ", - region_node->region.index, - region_node->region.ref_count); - } - n += scnprintf(buffer + n, debug_bufmax - n, "\n"); - up_read(&data->sem); + list_for_each_entry_safe(region, tmp_region, &vdm_index, index_list) { + n += scnprintf(buffer + n, debug_bufmax - n, + "(%d,%d,%d,%d) ", + region->index, region->pfn, region->used, region->post); } - up_read(&vdm_rwsem); n++; buffer[n] = 0; return simple_read_from_buffer(buf, count, ppos, buffer, n); -#else - return 0; -#endif } static struct file_operations debug_fops = { -- 2.34.1