mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
video/rockchip: rga2: Change the way to alloc memory in rga slt mode.
1. Fix compile error when debugfs is disable. 2. Using get_page to alloc memory can save 1250KB(64-bit)/625KB(32-bit) of memory in the data segment. ./scripts/bloat-o-meter -c drivers/video/rockchip/rga2/rga2_drv.o.old drivers/video/rockchip/rga2/rga2_drv.o add/remove: 1/0 grow/shrink: 1/1 up/down: 396/-104 (292) Function old new delta rga2_slt 864 1124 +260 rga2_service_session_clear.constprop - 136 +136 rga2_release 292 188 -104 Total: Before=18736, After=19028, chg +1.56% add/remove: 1/3 grow/shrink: 0/0 up/down: 8/-1280008 (-1280000) Data old new delta __addressable_rga2_init2808 - 8 +8 __addressable_rga2_init2895 8 - -8 src_buf 640000 - -640000 dst_buf 640000 - -640000 Total: Before=1282092, After=2092, chg -99.84% add/remove: 0/0 grow/shrink: 1/0 up/down: 9/0 (9) RO Data old new delta __func__ 57 66 +9 Total: Before=1537, After=1546, chg +0.59% Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: I21c36a268c86b75da7b9e8da5eaf4f1f698c9737
This commit is contained in:
@@ -485,6 +485,7 @@ int rga2_scale_check(struct rga2_req *req)
|
||||
INFO("rga2 scale check over.\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void rga2_printf_cmd_buf(u32 *cmd_buf)
|
||||
{
|
||||
@@ -514,8 +515,6 @@ static void rga2_printf_cmd_buf(u32 *cmd_buf)
|
||||
dst_aw, dst_ah, dst_stride, dst_format);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static bool is_yuv422p_format(u32 format)
|
||||
{
|
||||
bool ret = false;
|
||||
@@ -711,10 +710,11 @@ static int rga2_flush(rga2_session *session, unsigned long arg)
|
||||
{
|
||||
int ret = 0;
|
||||
int ret_timeout;
|
||||
|
||||
#if RGA2_DEBUGFS
|
||||
ktime_t start = ktime_set(0, 0);
|
||||
ktime_t end = ktime_set(0, 0);
|
||||
|
||||
#if RGA2_DEBUGFS
|
||||
if (RGA2_TEST_TIME)
|
||||
start = ktime_get();
|
||||
#endif
|
||||
@@ -1166,7 +1166,6 @@ static int rga2_get_img_info(rga_img_info_t *img,
|
||||
u32 vir_w, vir_h;
|
||||
int yrgb_addr = -1;
|
||||
int ret = 0;
|
||||
void *vaddr;
|
||||
|
||||
rga_dev = rga2_drvdata->dev;
|
||||
yrgb_addr = (int)img->yrgb_addr;
|
||||
@@ -1190,7 +1189,7 @@ static int rga2_get_img_info(rga_img_info_t *img,
|
||||
}
|
||||
#if RGA2_DEBUGFS
|
||||
if (RGA2_CHECK_MODE) {
|
||||
vaddr = dma_buf_vmap(dma_buf);
|
||||
void *vaddr = dma_buf_vmap(dma_buf);
|
||||
if (vaddr)
|
||||
rga2_memory_check(vaddr, img->vir_w, img->vir_h,
|
||||
img->format, img->yrgb_addr);
|
||||
@@ -2446,200 +2445,99 @@ static void rga2_debugfs_add(void)
|
||||
debugfs_remove_recursive(rga2_debug_root);
|
||||
}
|
||||
}
|
||||
#if (LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0))
|
||||
|
||||
void rga2_slt(void)
|
||||
{
|
||||
struct rga2_req req;
|
||||
rga2_session session;
|
||||
void *src_vir, *dst_vir;
|
||||
unsigned int *src, *dst;
|
||||
ion_phys_addr_t src_phy, dst_phy;
|
||||
int i;
|
||||
int src_size, dst_size, src_order, dst_order;
|
||||
int err_count = 0, right_count = 0;
|
||||
int task_running;
|
||||
unsigned int srcW, srcH, dstW, dstH;
|
||||
struct ion_handle *src_handle;
|
||||
struct ion_handle *dst_handle;
|
||||
struct rga2_drvdata_t *data;
|
||||
unsigned int srclen, dstlen;
|
||||
int err_count = 0;
|
||||
int right_count = 0;
|
||||
int size;
|
||||
unsigned int *pstd;
|
||||
unsigned int *pnow;
|
||||
|
||||
data = rga2_drvdata;
|
||||
srcW = 1280;
|
||||
srcH = 720;
|
||||
dstW = 1280;
|
||||
dstH = 720;
|
||||
src_handle = ion_alloc(data->ion_client, (size_t)srcW * srcH * 4, 0,
|
||||
ION_HEAP(ION_CMA_HEAP_ID), 0);
|
||||
|
||||
dst_handle = ion_alloc(data->ion_client, (size_t)dstW * dstH * 4, 0,
|
||||
ION_HEAP(ION_CMA_HEAP_ID), 0);
|
||||
|
||||
session.pid = current->pid;
|
||||
INIT_LIST_HEAD(&session.waiting);
|
||||
INIT_LIST_HEAD(&session.running);
|
||||
INIT_LIST_HEAD(&session.list_session);
|
||||
init_waitqueue_head(&session.wait);
|
||||
/* no need to protect */
|
||||
list_add_tail(&session.list_session, &rga2_service.session);
|
||||
atomic_set(&session.task_running, 0);
|
||||
atomic_set(&session.num_done, 0);
|
||||
|
||||
src_vir = ion_map_kernel(data->ion_client, src_handle);
|
||||
dst_vir = ion_map_kernel(data->ion_client, dst_handle);
|
||||
|
||||
ion_phys(rga2_drvdata->ion_client, src_handle, &src_phy, &srclen);
|
||||
ion_phys(rga2_drvdata->ion_client, dst_handle, &dst_phy, &dstlen);
|
||||
|
||||
memset(&req, 0, sizeof(struct rga2_req));
|
||||
src = (unsigned int *)src_vir;
|
||||
dst = (unsigned int *)dst_vir;
|
||||
|
||||
memset(src_vir, 0x80, srcW * srcH * 4);
|
||||
|
||||
INFO("\n********************************\n");
|
||||
INFO("************ RGA_TEST ************\n");
|
||||
INFO("********************************\n\n");
|
||||
|
||||
req.src.act_w = srcW;
|
||||
req.src.act_h = srcH;
|
||||
|
||||
req.src.vir_w = srcW;
|
||||
req.src.vir_h = srcW;
|
||||
req.src.yrgb_addr = 0;
|
||||
req.src.uv_addr = src_phy;
|
||||
req.src.v_addr = src_phy + srcH * srcW;
|
||||
req.src.format = RGA2_FORMAT_RGBA_8888;
|
||||
|
||||
req.dst.act_w = dstW;
|
||||
req.dst.act_h = dstH;
|
||||
|
||||
req.dst.vir_w = dstW;
|
||||
req.dst.vir_h = dstH;
|
||||
req.dst.x_offset = 0;
|
||||
req.dst.y_offset = 0;
|
||||
|
||||
req.dst.yrgb_addr = 0;
|
||||
req.dst.uv_addr = dst_phy;
|
||||
req.dst.v_addr = dst_phy + dstH * dstW;
|
||||
|
||||
req.dst.format = RGA2_FORMAT_RGBA_8888;
|
||||
|
||||
rga2_blit_sync(&session, &req);
|
||||
|
||||
size = dstW * dstH * 4;
|
||||
pstd = (unsigned int *)src_vir;
|
||||
pnow = (unsigned int *)dst_vir;
|
||||
|
||||
INFO("[ num : srcInfo dstInfo ]\n");
|
||||
for (i = 0; i < size / 4; i++) {
|
||||
if (*pstd != *pnow) {
|
||||
INFO("[X%.8d : 0x%x 0x%x]", i, *pstd, *pnow);
|
||||
if (i % 4 == 0)
|
||||
INFO("\n");
|
||||
err_count++;
|
||||
} else {
|
||||
if (i % (640 * 1024) == 0)
|
||||
INFO("[Y%.8d : 0x%.8x 0x%.8x]\n",
|
||||
i, *pstd, *pnow);
|
||||
right_count++;
|
||||
}
|
||||
pstd++;
|
||||
pnow++;
|
||||
if (err_count > 64)
|
||||
break;
|
||||
}
|
||||
|
||||
INFO("err_count=%d, right_count=%d\n", err_count, right_count);
|
||||
if (err_count != 0)
|
||||
INFO("rga slt err !!\n");
|
||||
else
|
||||
INFO("rga slt success !!\n");
|
||||
|
||||
ion_unmap_kernel(data->ion_client, src_handle);
|
||||
ion_unmap_kernel(data->ion_client, dst_handle);
|
||||
|
||||
ion_free(data->ion_client, src_handle);
|
||||
ion_free(data->ion_client, dst_handle);
|
||||
}
|
||||
#else
|
||||
unsigned long src_buf[400 * 200];
|
||||
unsigned long dst_buf[400 * 200];
|
||||
void rga2_slt(void)
|
||||
{
|
||||
struct rga2_req req;
|
||||
rga2_session session;
|
||||
unsigned int *pstd, *pnow;
|
||||
unsigned long *src_vir, *dst_vir;
|
||||
int i;
|
||||
unsigned int srcW, srcH, dstW, dstH;
|
||||
int err_count = 0;
|
||||
int right_count = 0;
|
||||
int size;
|
||||
unsigned int *pstd;
|
||||
unsigned int *pnow;
|
||||
struct rga2_req req;
|
||||
rga2_session session;
|
||||
|
||||
srcW = 400;
|
||||
srcH = 200;
|
||||
dstW = 400;
|
||||
dstH = 200;
|
||||
|
||||
session.pid = current->pid;
|
||||
src_size = srcW * srcH * 4;
|
||||
dst_size = dstW * dstH * 4;
|
||||
|
||||
src_order = get_order(src_size);
|
||||
src_vir = (unsigned long *)__get_free_pages(GFP_KERNEL | GFP_DMA32, src_order);
|
||||
if (src_vir == NULL) {
|
||||
ERR("%s[%d], can not alloc pages for src, order = %d\n",
|
||||
__func__, __LINE__, src_order);
|
||||
return;
|
||||
}
|
||||
|
||||
dst_order = get_order(dst_size);
|
||||
dst_vir = (unsigned long *)__get_free_pages(GFP_KERNEL | GFP_DMA32, dst_order);
|
||||
if (dst_vir == NULL) {
|
||||
ERR("%s[%d], can not alloc pages for dst, order = %d\n",
|
||||
__func__, __LINE__, dst_order);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Init session */
|
||||
session.pid = current->pid;
|
||||
|
||||
INIT_LIST_HEAD(&session.waiting);
|
||||
INIT_LIST_HEAD(&session.running);
|
||||
INIT_LIST_HEAD(&session.list_session);
|
||||
init_waitqueue_head(&session.wait);
|
||||
/* no need to protect */
|
||||
mutex_lock(&rga2_service.lock);
|
||||
list_add_tail(&session.list_session, &rga2_service.session);
|
||||
mutex_unlock(&rga2_service.lock);
|
||||
atomic_set(&session.task_running, 0);
|
||||
atomic_set(&session.num_done, 0);
|
||||
|
||||
memset(&req, 0, sizeof(struct rga2_req));
|
||||
src_vir = src_buf;
|
||||
dst_vir = dst_buf;
|
||||
|
||||
memset(src_buf, 0x50, 400 * 200 * 4);
|
||||
memset(dst_buf, 0x00, 400 * 200 * 4);
|
||||
|
||||
rga2_dma_flush_range(&src_buf[0], &src_buf[400 * 200]);
|
||||
rga2_dma_flush_range(&dst_buf[0], &dst_buf[400 * 200]);
|
||||
|
||||
INFO("\n********************************\n");
|
||||
INFO("**********************************\n");
|
||||
INFO("************ RGA_TEST ************\n");
|
||||
INFO("********************************\n\n");
|
||||
INFO("**********************************\n");
|
||||
|
||||
memset(src_vir, 0x50, src_size);
|
||||
memset(dst_vir, 0x50, dst_size);
|
||||
|
||||
rga2_dma_flush_range(src_vir, src_vir + src_size);
|
||||
rga2_dma_flush_range(dst_vir, dst_vir + dst_size);
|
||||
|
||||
memset(&req, 0, sizeof(struct rga2_req));
|
||||
req.src.x_offset = 0;
|
||||
req.src.y_offset = 0;
|
||||
req.src.act_w = srcW;
|
||||
req.src.act_h = srcH;
|
||||
|
||||
req.src.vir_w = srcW;
|
||||
req.src.vir_h = srcW;
|
||||
req.src.format = RGA2_FORMAT_RGBA_8888;
|
||||
|
||||
req.src.yrgb_addr = 0;
|
||||
req.src.uv_addr = (unsigned long)virt_to_phys(src_vir);
|
||||
req.src.v_addr = req.src.uv_addr + srcH * srcW;
|
||||
req.src.format = RGA2_FORMAT_RGBA_8888;
|
||||
|
||||
req.dst.act_w = dstW;
|
||||
req.dst.act_h = dstH;
|
||||
|
||||
req.dst.vir_w = dstW;
|
||||
req.dst.vir_h = dstH;
|
||||
req.dst.x_offset = 0;
|
||||
req.dst.y_offset = 0;
|
||||
req.dst.act_w = dstW;
|
||||
req.dst.act_h = dstH;
|
||||
req.dst.vir_w = dstW;
|
||||
req.dst.vir_h = dstH;
|
||||
req.dst.format = RGA2_FORMAT_RGBA_8888;
|
||||
|
||||
req.dst.yrgb_addr = 0;
|
||||
req.dst.uv_addr = (unsigned long)virt_to_phys(dst_vir);
|
||||
req.dst.v_addr = req.dst.uv_addr + dstH * dstW;
|
||||
|
||||
req.dst.format = RGA2_FORMAT_RGBA_8888;
|
||||
rga2_blit_sync(&session, &req);
|
||||
|
||||
size = dstW * dstH * 4;
|
||||
/* Check buffer */
|
||||
pstd = (unsigned int *)src_vir;
|
||||
pnow = (unsigned int *)dst_vir;
|
||||
|
||||
INFO("[ num : srcInfo dstInfo ]\n");
|
||||
for (i = 0; i < size / 4; i++) {
|
||||
for (i = 0; i < dst_size / 4; i++) {
|
||||
if (*pstd != *pnow) {
|
||||
INFO("[X%.8d : 0x%x 0x%x]", i, *pstd, *pnow);
|
||||
if (i % 4 == 0)
|
||||
@@ -2662,9 +2560,24 @@ void rga2_slt(void)
|
||||
INFO("rga slt err !!\n");
|
||||
else
|
||||
INFO("rga slt success !!\n");
|
||||
|
||||
/* Deinit session */
|
||||
task_running = atomic_read(&session.task_running);
|
||||
if (task_running) {
|
||||
pr_err("%s[%d], session %d still has %d task running when closing\n",
|
||||
__func__, __LINE__, session.pid, task_running);
|
||||
msleep(100);
|
||||
}
|
||||
wake_up(&session.wait);
|
||||
mutex_lock(&rga2_service.lock);
|
||||
list_del(&session.list_session);
|
||||
rga2_service_session_clear(&session);
|
||||
mutex_unlock(&rga2_service.lock);
|
||||
|
||||
free_pages((unsigned long)src_vir, src_order);
|
||||
free_pages((unsigned long)dst_vir, dst_order);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
void rga2_test_0(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user