video: rockchip: rga3: Add judgment on support core.

Added policy to disable RGA2 when memory larger than 4G.

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: I5f4d9ee0d77709fbf350123bf16dc42f0b7abbe7
This commit is contained in:
Yu Qiaowei
2022-01-13 16:45:10 +08:00
committed by Tao Huang
parent 031470058a
commit db0f336d88
5 changed files with 92 additions and 6 deletions

View File

@@ -14,10 +14,11 @@
#include "rga_drv.h"
enum job_flags {
RGA_JOB_DONE = 1 << 0,
RGA_JOB_ASYNC = 1 << 1,
RGA_JOB_SYNC = 1 << 2,
RGA_JOB_USE_HANDLE = 1 << 3,
RGA_JOB_DONE = 1 << 0,
RGA_JOB_ASYNC = 1 << 1,
RGA_JOB_SYNC = 1 << 2,
RGA_JOB_USE_HANDLE = 1 << 3,
RGA_JOB_UNSUPPORT_RGA2 = 1 << 4,
};
struct rga_scheduler_t *rga_job_get_scheduler(int core);

View File

@@ -34,6 +34,7 @@ struct rga_mm {
};
struct rga_internal_buffer *rga_mm_lookup_handle(struct rga_mm *mm_session, uint32_t handle);
int rga_mm_lookup_flag(struct rga_mm *mm_session, uint64_t handle);
dma_addr_t rga_mm_lookup_iova(struct rga_internal_buffer *buffer, int core);
struct sg_table *rga_mm_lookup_sgt(struct rga_internal_buffer *buffer, int core);

View File

@@ -141,6 +141,67 @@ static int rga_job_cleanup(struct rga_job *job)
return 0;
}
static int rga_job_judgment_support_core(struct rga_job *job)
{
int ret = 0;
uint32_t mm_flag;
struct rga_req *req;
struct rga_mm *mm;
req = &job->rga_command_base;
mm = rga_drvdata->mm;
if (mm == NULL) {
pr_err("rga mm is null!\n");
return -EFAULT;
}
mutex_lock(&mm->lock);
if (likely(req->src.yrgb_addr > 0)) {
ret = rga_mm_lookup_flag(mm, req->src.yrgb_addr);
if (ret < 0)
goto out_finish;
else
mm_flag = (uint32_t)ret;
if (~mm_flag & RGA_MM_UNDER_4G) {
job->flags |= RGA_JOB_UNSUPPORT_RGA2;
goto out_finish;
}
}
if (likely(req->dst.yrgb_addr > 0)) {
ret = rga_mm_lookup_flag(mm, req->dst.yrgb_addr);
if (ret < 0)
goto out_finish;
else
mm_flag = (uint32_t)ret;
if (~mm_flag & RGA_MM_UNDER_4G) {
job->flags |= RGA_JOB_UNSUPPORT_RGA2;
goto out_finish;
}
}
if (req->pat.yrgb_addr > 0) {
ret = rga_mm_lookup_flag(mm, req->pat.yrgb_addr);
if (ret < 0)
goto out_finish;
else
mm_flag = (uint32_t)ret;
if (~mm_flag & RGA_MM_UNDER_4G) {
job->flags |= RGA_JOB_UNSUPPORT_RGA2;
goto out_finish;
}
}
out_finish:
mutex_unlock(&mm->lock);
return ret;
}
static struct rga_job *rga_job_alloc(struct rga_req *rga_command_base)
{
struct rga_job *job = NULL;
@@ -164,10 +225,13 @@ static struct rga_job *rga_job_alloc(struct rga_req *rga_command_base)
job->priority = rga_command_base->priority;
}
if (job->rga_command_base.handle_flag & 1)
if (job->rga_command_base.handle_flag & 1) {
job->flags |= RGA_JOB_USE_HANDLE;
else
rga_job_judgment_support_core(job);
} else {
rga_job_get_current_mm(job);
}
return job;
}

View File

@@ -683,6 +683,19 @@ struct rga_internal_buffer *rga_mm_lookup_handle(struct rga_mm *mm_session, uint
return output_buffer;
}
int rga_mm_lookup_flag(struct rga_mm *mm_session, uint64_t handle)
{
struct rga_internal_buffer *output_buffer;
output_buffer = rga_mm_lookup_handle(mm_session, handle);
if (output_buffer == NULL) {
pr_err("This handle[%ld] is illegal.\n", (unsigned long)handle);
return -EINVAL;
}
return output_buffer->mm_flag;
}
dma_addr_t rga_mm_lookup_iova(struct rga_internal_buffer *buffer, int core)
{
int i;

View File

@@ -205,6 +205,13 @@ int rga_job_assign(struct rga_job *job)
if (RGA_DEBUG_MSG)
pr_err("start policy on core = %d", scheduler->core);
if (scheduler->core == RGA2_SCHEDULER_CORE0 &&
job->flags & RGA_JOB_UNSUPPORT_RGA2) {
if (RGA_DEBUG_MSG)
pr_debug("RGA2 only support under 4G memory!\n");
continue;
}
if (feature > 0) {
if (!(feature & data->feature)) {
if (RGA_DEBUG_MSG)