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:
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
/*
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user