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:
Yu Qiaowei
2022-04-24 16:53:01 +08:00
committed by Tao Huang
parent 9985c89e5f
commit 59483bb7f3
6 changed files with 191 additions and 1205 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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 {

View File

@@ -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,