mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
video: rockchip: rga3: Refactor rga2_mmu_info.c
Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com> Change-Id: Iee7c73e388c05079d7713e1575dc34a589a7190a
This commit is contained in:
@@ -12,15 +12,6 @@
|
||||
*/
|
||||
#define RGA2_PHY_PAGE_SIZE (((8192 * 8192 * 4) / 4096) + 1)
|
||||
|
||||
enum {
|
||||
MMU_MAP_CLEAN = 1 << 0,
|
||||
MMU_MAP_INVALID = 1 << 1,
|
||||
MMU_MAP_MASK = 0x03,
|
||||
MMU_UNMAP_CLEAN = 1 << 2,
|
||||
MMU_UNMAP_INVALID = 1 << 3,
|
||||
MMU_UNMAP_MASK = 0x0c,
|
||||
};
|
||||
|
||||
struct rga2_mmu_info_t {
|
||||
int32_t front;
|
||||
int32_t back;
|
||||
@@ -35,11 +26,14 @@ struct rga2_mmu_info_t {
|
||||
u8 pages_order;
|
||||
};
|
||||
|
||||
void rga2_dma_flush_cache_for_virtual_address(struct rga2_mmu_other_t *reg,
|
||||
struct rga_scheduler_t *scheduler);
|
||||
int rga2_user_memory_check(struct page **pages, u32 w, u32 h, u32 format, int flag);
|
||||
|
||||
int rga2_set_mmu_reg_info(struct rga2_mmu_other_t *reg,
|
||||
struct rga2_req *req, struct rga_job *job);
|
||||
int rga2_set_mmu_base(struct rga_job *job, struct rga2_req *req);
|
||||
|
||||
unsigned int *rga2_mmu_buf_get(uint32_t size);
|
||||
|
||||
int rga2_mmu_base_init(void);
|
||||
void rga2_mmu_base_free(void);
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2213,7 +2213,6 @@ int rga2_init_reg(struct rga_job *job)
|
||||
{
|
||||
struct rga2_req req;
|
||||
int ret = 0;
|
||||
struct rga2_mmu_info_t *tbuf = &rga2_mmu_info;
|
||||
struct rga_scheduler_t *scheduler = NULL;
|
||||
|
||||
scheduler = rga_job_get_scheduler(job);
|
||||
@@ -2256,7 +2255,7 @@ int rga2_init_reg(struct rga_job *job)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = rga2_set_mmu_reg_info(&job->vir_page_table, &req, job);
|
||||
ret = rga2_set_mmu_base(job, &req);
|
||||
if (ret < 0) {
|
||||
pr_err("%s, [%d] set mmu info error\n", __func__,
|
||||
__LINE__);
|
||||
@@ -2264,17 +2263,6 @@ int rga2_init_reg(struct rga_job *job)
|
||||
}
|
||||
}
|
||||
|
||||
mutex_lock(&rga_drvdata->lock);
|
||||
|
||||
if (job->vir_page_table.MMU_len && tbuf) {
|
||||
if (tbuf->back + job->vir_page_table.MMU_len > 2 * tbuf->size)
|
||||
tbuf->back = job->vir_page_table.MMU_len + tbuf->size;
|
||||
else
|
||||
tbuf->back += job->vir_page_table.MMU_len;
|
||||
}
|
||||
|
||||
mutex_unlock(&rga_drvdata->lock);
|
||||
|
||||
if (rga2_gen_reg_info((uint8_t *)job->cmd_reg, &req) == -1) {
|
||||
pr_err("gen reg info error\n");
|
||||
return -EINVAL;
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
#include "rga2_mmu_info.h"
|
||||
#include "rga_debugger.h"
|
||||
|
||||
struct rga2_mmu_info_t rga2_mmu_info;
|
||||
|
||||
struct rga_drvdata_t *rga_drvdata;
|
||||
|
||||
/* set hrtimer */
|
||||
@@ -1430,72 +1428,6 @@ static struct platform_driver rga2_driver = {
|
||||
},
|
||||
};
|
||||
|
||||
static int rga2_mmu_base_init(void)
|
||||
{
|
||||
int order = 0;
|
||||
uint32_t *buf_p;
|
||||
uint32_t *buf;
|
||||
|
||||
/*
|
||||
* malloc pre scale mid buf mmu table:
|
||||
* RGA2_PHY_PAGE_SIZE * channel_num * address_size
|
||||
*/
|
||||
order = get_order(RGA2_PHY_PAGE_SIZE * 3 * sizeof(buf_p));
|
||||
buf_p = (uint32_t *) __get_free_pages(GFP_KERNEL | GFP_DMA32, order);
|
||||
if (buf_p == NULL) {
|
||||
pr_err("Can not alloc pages for mmu_page_table\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
rga2_mmu_info.buf_order = order;
|
||||
|
||||
order = get_order(RGA2_PHY_PAGE_SIZE * sizeof(struct page *));
|
||||
rga2_mmu_info.pages =
|
||||
(struct page **)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
|
||||
if (rga2_mmu_info.pages == NULL) {
|
||||
pr_err("Can not alloc pages for rga2_mmu_info.pages\n");
|
||||
goto err_free_buf_virtual;
|
||||
}
|
||||
|
||||
rga2_mmu_info.pages_order = order;
|
||||
|
||||
#if (defined(CONFIG_ARM) && defined(CONFIG_ARM_LPAE))
|
||||
buf =
|
||||
(uint32_t *) (uint32_t)
|
||||
virt_to_phys((void *)((unsigned long)buf_p));
|
||||
#else
|
||||
buf = (uint32_t *) virt_to_phys((void *)((unsigned long)buf_p));
|
||||
#endif
|
||||
rga2_mmu_info.buf_virtual = buf_p;
|
||||
rga2_mmu_info.buf = buf;
|
||||
rga2_mmu_info.front = 0;
|
||||
rga2_mmu_info.back = RGA2_PHY_PAGE_SIZE * 3;
|
||||
rga2_mmu_info.size = RGA2_PHY_PAGE_SIZE * 3;
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_buf_virtual:
|
||||
free_pages((unsigned long)buf_p, rga2_mmu_info.buf_order);
|
||||
rga2_mmu_info.buf_order = 0;
|
||||
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static void rga2_mmu_base_free(void)
|
||||
{
|
||||
if (rga2_mmu_info.buf_virtual != NULL) {
|
||||
free_pages((unsigned long)rga2_mmu_info.buf_virtual, rga2_mmu_info.buf_order);
|
||||
rga2_mmu_info.buf_virtual = NULL;
|
||||
rga2_mmu_info.buf_order = 0;
|
||||
}
|
||||
|
||||
if (rga2_mmu_info.pages != NULL) {
|
||||
free_pages((unsigned long)rga2_mmu_info.pages, rga2_mmu_info.pages_order);
|
||||
rga2_mmu_info.pages = NULL;
|
||||
rga2_mmu_info.pages_order = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init rga_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -387,10 +387,6 @@ static void rga_job_finish_and_next(struct rga_scheduler_t *scheduler,
|
||||
ktime_us_delta(now, job->timestamp));
|
||||
}
|
||||
|
||||
if (job->core == RGA2_SCHEDULER_CORE0)
|
||||
rga2_dma_flush_cache_for_virtual_address(&job->vir_page_table,
|
||||
scheduler);
|
||||
|
||||
if (job->flags & RGA_JOB_USE_HANDLE) {
|
||||
rga_mm_put_handle_info(job);
|
||||
} else {
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include "rga_mm.h"
|
||||
#include "rga_dma_buf.h"
|
||||
#include "rga_common.h"
|
||||
#include "rga2_mmu_info.h"
|
||||
|
||||
static void rga_current_mm_read_lock(struct mm_struct *mm)
|
||||
{
|
||||
@@ -935,7 +936,7 @@ static int rga_mm_set_mmu_base(struct rga_job *job,
|
||||
int uv_count = 0;
|
||||
int v_count = 0;
|
||||
int page_count = 0;
|
||||
int order;
|
||||
int order = 0;
|
||||
uint32_t *page_table = NULL;
|
||||
struct sg_table *sgt = NULL;
|
||||
|
||||
@@ -973,11 +974,20 @@ static int rga_mm_set_mmu_base(struct rga_job *job,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
order = get_order(page_count * sizeof(uint32_t *));
|
||||
page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
|
||||
if (page_table == NULL) {
|
||||
pr_err("%s can not alloc pages for pages, order = %d\n", __func__, order);
|
||||
return -ENOMEM;
|
||||
if (job->flags & RGA_JOB_USE_HANDLE) {
|
||||
order = get_order(page_count * sizeof(uint32_t *));
|
||||
page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
|
||||
if (page_table == NULL) {
|
||||
pr_err("%s can not alloc pages for pages, order = %d\n",
|
||||
__func__, order);
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else {
|
||||
page_table = rga2_mmu_buf_get(page_count);
|
||||
if (page_table == NULL) {
|
||||
pr_err("mmu_buf get error!\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
sgt = rga_mm_lookup_sgt(job_buf->y_addr, job->core);
|
||||
@@ -1018,11 +1028,20 @@ static int rga_mm_set_mmu_base(struct rga_job *job,
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
order = get_order(page_count * sizeof(uint32_t *));
|
||||
page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
|
||||
if (page_table == NULL) {
|
||||
pr_err("%s can not alloc pages for pages, order = %d\n", __func__, order);
|
||||
return -ENOMEM;
|
||||
if (job->flags & RGA_JOB_USE_HANDLE) {
|
||||
order = get_order(page_count * sizeof(uint32_t *));
|
||||
page_table = (uint32_t *)__get_free_pages(GFP_KERNEL | GFP_DMA32, order);
|
||||
if (page_table == NULL) {
|
||||
pr_err("%s can not alloc pages for pages, order = %d\n",
|
||||
__func__, order);
|
||||
return -ENOMEM;
|
||||
}
|
||||
} else {
|
||||
page_table = rga2_mmu_buf_get(page_count);
|
||||
if (page_table == NULL) {
|
||||
pr_err("mmu_buf get error!\n");
|
||||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
|
||||
sgt = rga_mm_lookup_sgt(job_buf->addr, job->core);
|
||||
@@ -1044,7 +1063,8 @@ static int rga_mm_set_mmu_base(struct rga_job *job,
|
||||
return 0;
|
||||
|
||||
err_free_page_table:
|
||||
free_pages((unsigned long)page_table, order);
|
||||
if (job->flags & RGA_JOB_USE_HANDLE)
|
||||
free_pages((unsigned long)page_table, order);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1380,8 +1400,7 @@ static void rga_mm_unmap_channel_job_buffer(struct rga_job *job,
|
||||
rga_mm_unmap_buffer(job_buffer->addr);
|
||||
kfree(job_buffer->addr);
|
||||
|
||||
if (job_buffer->page_table && job_buffer->order)
|
||||
free_pages((unsigned long)job_buffer->page_table, job_buffer->order);
|
||||
job_buffer->page_table = NULL;
|
||||
}
|
||||
|
||||
static int rga_mm_map_channel_job_buffer(struct rga_job *job,
|
||||
|
||||
Reference in New Issue
Block a user