mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 11:26:02 +09:00
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 <herman.chen@rock-chips.com>
This commit is contained in:
@@ -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++)
|
||||
|
||||
Reference in New Issue
Block a user