mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 05:17:10 +09:00
rk29: vpu_mem: add debug_read function and some comments
This commit is contained in:
@@ -28,15 +28,12 @@
|
||||
|
||||
#include <mach/vpu_mem.h>
|
||||
|
||||
#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 = {
|
||||
|
||||
Reference in New Issue
Block a user