diff --git a/drivers/video/rockchip/rga3/include/rga_common.h b/drivers/video/rockchip/rga3/include/rga_common.h index 875dd8731709..addd4cb7a2a8 100644 --- a/drivers/video/rockchip/rga3/include/rga_common.h +++ b/drivers/video/rockchip/rga3/include/rga_common.h @@ -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); diff --git a/drivers/video/rockchip/rga3/include/rga_drv.h b/drivers/video/rockchip/rga3/include/rga_drv.h index 3e75cca1aa7d..225574528c28 100644 --- a/drivers/video/rockchip/rga3/include/rga_drv.h +++ b/drivers/video/rockchip/rga3/include/rga_drv.h @@ -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)) diff --git a/drivers/video/rockchip/rga3/rga_common.c b/drivers/video/rockchip/rga3/rga_common.c index 204895905310..f3b28350bf3c 100644 --- a/drivers/video/rockchip/rga3/rga_common.c +++ b/drivers/video/rockchip/rga3/rga_common.c @@ -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) { /* diff --git a/drivers/video/rockchip/rga3/rga_mm.c b/drivers/video/rockchip/rga3/rga_mm.c index e05550c33a17..4f35b1db9a89 100644 --- a/drivers/video/rockchip/rga3/rga_mm.c +++ b/drivers/video/rockchip/rga3/rga_mm.c @@ -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;