\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
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
#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
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
{\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
_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
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
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
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
}\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
/* 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
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