video: rockchip: rga3: check mm_flag when mapping dma-buf

This part of the information is printed when the mapping fails
due to MMU limitations.

Update driver version to 1.2.17

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: I2d6e4219ebc54d285bc9c25742f93503f7633b5e
This commit is contained in:
Yu Qiaowei
2022-07-12 15:05:19 +08:00
committed by Tao Huang
parent fb617a18f5
commit 17b7ac8a5b
4 changed files with 34 additions and 6 deletions

View File

@@ -10,6 +10,7 @@
#define __LINUX_RKRGA_COMMON_H_
#include "rga_drv.h"
#include "rga_hw_config.h"
#define RGA_GET_PAGE_COUNT(size) (((size) >> PAGE_SHIFT) + (((size) & (~PAGE_MASK)) ? 1 : 0))
@@ -33,6 +34,7 @@ const char *rga_get_blend_mode_str(uint16_t alpha_rop_flag,
uint16_t alpha_mode_0,
uint16_t alpha_mode_1);
const char *rga_get_memory_type_str(uint8_t type);
const char *rga_get_mmu_type_str(enum rga_mmu mmu_type);
void rga_convert_addr(struct rga_img_info_t *img, bool before_vir_get_channel);
void rga_swap_pd_mode(struct rga_req *req_rga);

View File

@@ -86,7 +86,7 @@
#define DRIVER_MAJOR_VERISON 1
#define DRIVER_MINOR_VERSION 2
#define DRIVER_REVISION_VERSION 16
#define DRIVER_REVISION_VERSION 17
#define DRIVER_VERSION (STR(DRIVER_MAJOR_VERISON) "." STR(DRIVER_MINOR_VERSION) \
"." STR(DRIVER_REVISION_VERSION))

View File

@@ -514,6 +514,18 @@ const char *rga_get_memory_type_str(uint8_t type)
}
}
const char *rga_get_mmu_type_str(enum rga_mmu mmu_type)
{
switch (mmu_type) {
case RGA_MMU:
return "RGA_MMU";
case RGA_IOMMU:
return "RK_IOMMU";
default:
return "NONE_MMU";
}
}
void rga_convert_addr(struct rga_img_info_t *img, bool before_vir_get_channel)
{
/*

View File

@@ -300,8 +300,11 @@ static inline bool rga_mm_check_memory_limit(struct rga_scheduler_t *scheduler,
return false;
if (scheduler->data->mmu == RGA_MMU &&
!(mm_flag & RGA_MEM_UNDER_4G))
!(mm_flag & RGA_MEM_UNDER_4G)) {
pr_err("%s unsupported Memory larger than 4G!\n",
rga_get_mmu_type_str(scheduler->data->mmu));
return false;
}
return true;
}
@@ -355,6 +358,8 @@ static int rga_mm_map_dma_buffer(struct rga_external_buffer *external_buffer,
struct rga_job *job)
{
int ret;
uint32_t mm_flag = 0;
phys_addr_t phys_addr = 0;
struct rga_dma_buffer *buffer;
struct device *map_dev;
struct rga_scheduler_t *scheduler;
@@ -402,23 +407,32 @@ static int rga_mm_map_dma_buffer(struct rga_external_buffer *external_buffer,
buffer->scheduler = scheduler;
if (rga_mm_check_range_sgt(buffer->sgt))
internal_buffer->mm_flag |= RGA_MEM_UNDER_4G;
mm_flag |= RGA_MEM_UNDER_4G;
/*
* If it's physically contiguous, then the RGA_MMU can
* directly use the physical address.
*/
if (rga_mm_check_contiguous_sgt(buffer->sgt)) {
internal_buffer->phys_addr = sg_phys(buffer->sgt->sgl);
if (internal_buffer->phys_addr == 0) {
phys_addr = sg_phys(buffer->sgt->sgl);
if (phys_addr == 0) {
pr_err("%s get physical address error!", __func__);
goto unmap_buffer;
}
internal_buffer->mm_flag |= RGA_MEM_PHYSICAL_CONTIGUOUS;
mm_flag |= RGA_MEM_PHYSICAL_CONTIGUOUS;
}
if (!rga_mm_check_memory_limit(scheduler, mm_flag)) {
pr_err("scheduler core[%d] unsupported mm_flag[0x%x]!\n",
scheduler->core, mm_flag);
ret = -EINVAL;
goto unmap_buffer;
}
internal_buffer->dma_buffer = buffer;
internal_buffer->mm_flag = mm_flag;
internal_buffer->phys_addr = phys_addr ? phys_addr : 0;
return 0;