From dc6c729aa15449a2ce7a048b6948d1a8373141ee Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Wed, 5 Dec 2018 09:34:19 +0800 Subject: [PATCH] video: rockchip: vpu: Add clean cache for rkvdec Add different clean cache operation for vpu / hevc / rkvdec. Change-Id: I22f89d7648338f9788f5f2fff26b4ce815865809 Signed-off-by: Herman Chen --- .../video/rockchip/vcodec/vcodec_service.c | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/drivers/video/rockchip/vcodec/vcodec_service.c b/drivers/video/rockchip/vcodec/vcodec_service.c index ba4382f443a8..fcf7a043f7b9 100644 --- a/drivers/video/rockchip/vcodec/vcodec_service.c +++ b/drivers/video/rockchip/vcodec/vcodec_service.c @@ -446,6 +446,7 @@ struct vcodec_hw_ops { void (*set_freq)(struct vpu_service_info *pservice, struct vpu_reg *reg); void (*reduce_freq)(struct vpu_service_info *pservice); + void (*clr_cache)(struct vpu_service_info *pservice); }; struct vcodec_hw_var { @@ -463,15 +464,17 @@ struct compat_vpu_request { }; #endif -#define VDPU_CLEAN_CACHE_REG 516 -#define VEPU_CLEAN_CACHE_REG 772 -#define HEVC_CLEAN_CACHE_REG 260 +#define VDPU_CLR_CACHE_REG 516 +#define VEPU_CLR_CACHE_REG 772 +#define VDEC_CLR_CACHE0_REG 260 +#define VDEC_CLR_CACHE1_REG 276 -#define VPU_REG_ENABLE(base, reg) writel_relaxed(1, base + reg) +#define VPU_REG_EN(base, reg) writel_relaxed(1, (base) + (reg)) -#define VDPU_CLEAN_CACHE(base) VPU_REG_ENABLE(base, VDPU_CLEAN_CACHE_REG) -#define VEPU_CLEAN_CACHE(base) VPU_REG_ENABLE(base, VEPU_CLEAN_CACHE_REG) -#define HEVC_CLEAN_CACHE(base) VPU_REG_ENABLE(base, HEVC_CLEAN_CACHE_REG) +#define VDPU_CLR_CACHE(base) VPU_REG_EN(base, VDPU_CLR_CACHE_REG) +#define VEPU_CLR_CACHE(base) VPU_REG_EN(base, VEPU_CLR_CACHE_REG) +#define VDEC_CLR_CACHE0(base) VPU_REG_EN(base, VDEC_CLR_CACHE0_REG) +#define VDEC_CLR_CACHE1(base) VPU_REG_EN(base, VDEC_CLR_CACHE1_REG) #define VPU_POWER_OFF_DELAY (4 * HZ) /* 4s */ #define VPU_TIMEOUT_DELAY (2 * HZ) /* 2s */ @@ -1444,7 +1447,7 @@ static void reg_copy_to_hw(struct vpu_subdev_data *data, struct vpu_reg *reg) "reg: base %3d end %d en %2d mask: en %x gate %x\n", base, end, reg_en, enable_mask, gating_mask); - VEPU_CLEAN_CACHE(dst); + VEPU_CLR_CACHE(dst); if (debug & DEBUG_SET_REG) for (i = base; i < end; i++) @@ -1481,15 +1484,25 @@ static void reg_copy_to_hw(struct vpu_subdev_data *data, struct vpu_reg *reg) "reg: base %3d end %d en %2d mask: en %x gate %x\n", base, end, reg_en, enable_mask, gating_mask); - VDPU_CLEAN_CACHE(dst); - - /* on rkvdec set cache size to 64byte */ - if (pservice->dev_id == VCODEC_DEVICE_ID_RKVDEC) { + switch (data->mode) { + case VCODEC_RUNNING_MODE_HEVC: { + VDEC_CLR_CACHE0(dst); + } break; + case VCODEC_RUNNING_MODE_RKVDEC: { + /* on rkvdec set cache size to 64byte */ u32 *cache_base = dst + 0x100; u32 val = (debug & DEBUG_CACHE_32B) ? (0x3) : (0x13); writel_relaxed(val, cache_base + 0x07); writel_relaxed(val, cache_base + 0x17); + + VDEC_CLR_CACHE0(dst); + VDEC_CLR_CACHE1(dst); + } break; + case VCODEC_RUNNING_MODE_VPU: + default: { + VDPU_CLR_CACHE(dst); + } break; } if (debug & DEBUG_SET_REG) @@ -1552,7 +1565,7 @@ static void reg_copy_to_hw(struct vpu_subdev_data *data, struct vpu_reg *reg) base, end, reg_en, enable_mask, gating_mask); /* VDPU_SOFT_RESET(dst); */ - VDPU_CLEAN_CACHE(dst); + VDPU_CLR_CACHE(dst); if (debug & DEBUG_SET_REG) for (i = base; i < end; i++)