Disable iommu when vpu in failure state, so iommu could
restore its state in the next task in.
Signed-off-by: Alpha Lin <alpha.lin@rock-chips.com>
clocks = <&clk_vdpu>, <&hclk_vdpu>;
clock-names = "aclk_vcodec", "hclk_vcodec";
name = "vpu_service";
clocks = <&clk_vdpu>, <&hclk_vdpu>;
clock-names = "aclk_vcodec", "hclk_vcodec";
name = "vpu_service";
//status = "disabled";
};
//status = "disabled";
};
interrupt-names = "irq_dec";
clocks = <&aclk_hevc>, <&hclk_hevc>, <&clk_hevc_core>, <&clk_hevc_cabac>;
clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core", "clk_cabac";
interrupt-names = "irq_dec";
clocks = <&aclk_hevc>, <&hclk_hevc>, <&clk_hevc_core>, <&clk_hevc_cabac>;
clock-names = "aclk_vcodec", "hclk_vcodec", "clk_core", "clk_cabac";
name = "hevc_service";
//status = "disabled";
};
name = "hevc_service";
//status = "disabled";
};
#if defined(CONFIG_VCODEC_MMU)
struct list_head mem_region_list;
#endif
#if defined(CONFIG_VCODEC_MMU)
struct list_head mem_region_list;
#endif
} vpu_reg;
typedef struct vpu_device {
} vpu_reg;
typedef struct vpu_device {
u32 raw = 0;
struct vpu_service_info *pservice = data->pservice;
struct vpu_subdev_data *subdata, *n;
u32 raw = 0;
struct vpu_service_info *pservice = data->pservice;
struct vpu_subdev_data *subdata, *n;
- if (pservice->subcnt < 2 || pservice->curr_mode == data->mode) {
- pservice->prev_mode = pservice->curr_mode;
+ if (pservice->subcnt < 2) {
+#if defined(CONFIG_VCODEC_MMU)
+ if (data->mmu_dev && !test_bit(MMU_ACTIVATED, &data->state)) {
+ set_bit(MMU_ACTIVATED, &data->state);
+ BUG_ON(!pservice->enabled);
+ if (pservice->enabled)
+ rockchip_iovmm_activate(data->dev);
+ }
+#endif
+
+ if (pservice->curr_mode == data->mode)
+ return;
+
vpu_debug(3, "vcodec enter mode %d\n", data->mode);
#if defined(CONFIG_VCODEC_MMU)
list_for_each_entry_safe(subdata, n, &pservice->subdev_list, lnk_service) {
vpu_debug(3, "vcodec enter mode %d\n", data->mode);
#if defined(CONFIG_VCODEC_MMU)
list_for_each_entry_safe(subdata, n, &pservice->subdev_list, lnk_service) {
#if VCODEC_CLOCK_ENABLE
switch (pservice->dev_id) {
case VCODEC_DEVICE_ID_HEVC:
#if VCODEC_CLOCK_ENABLE
switch (pservice->dev_id) {
case VCODEC_DEVICE_ID_HEVC:
- pservice->clk_cabac = devm_clk_get(pservice->dev, "clk_cabac");
- if (IS_ERR(pservice->clk_cabac)) {
- dev_err(pservice->dev, "failed on clk_get clk_cabac\n");
- return -1;
- }
-
pservice->pd_video = devm_clk_get(pservice->dev, "pd_hevc");
if (IS_ERR(pservice->pd_video)) {
dev_err(pservice->dev, "failed on clk_get pd_hevc\n");
return -1;
}
case VCODEC_DEVICE_ID_COMBO:
pservice->pd_video = devm_clk_get(pservice->dev, "pd_hevc");
if (IS_ERR(pservice->pd_video)) {
dev_err(pservice->dev, "failed on clk_get pd_hevc\n");
return -1;
}
case VCODEC_DEVICE_ID_COMBO:
+ pservice->clk_cabac = devm_clk_get(pservice->dev, "clk_cabac");
+ if (IS_ERR(pservice->clk_cabac)) {
+ dev_err(pservice->dev, "failed on clk_get clk_cabac\n");
+ pservice->clk_cabac = NULL;
+ }
pservice->clk_core = devm_clk_get(pservice->dev, "clk_core");
if (IS_ERR(pservice->clk_core)) {
dev_err(pservice->dev, "failed on clk_get clk_core\n");
pservice->clk_core = devm_clk_get(pservice->dev, "clk_core");
if (IS_ERR(pservice->clk_core)) {
dev_err(pservice->dev, "failed on clk_get clk_core\n");
pservice->reg_resev = NULL;
#if defined(CONFIG_VCODEC_MMU)
pservice->reg_resev = NULL;
#if defined(CONFIG_VCODEC_MMU)
- if (data->mmu_dev && !test_bit(MMU_ACTIVATED, &data->state)) {
- set_bit(MMU_ACTIVATED, &data->state);
+ if (data->mmu_dev && test_bit(MMU_ACTIVATED, &data->state)) {
+ clear_bit(MMU_ACTIVATED, &data->state);
BUG_ON(!pservice->enabled);
if (pservice->enabled)
BUG_ON(!pservice->enabled);
if (pservice->enabled)
- rockchip_iovmm_activate(data->dev);
+ rockchip_iovmm_deactivate(data->dev);
static inline bool reg_check_rmvb_wmv(vpu_reg *reg)
{
static inline bool reg_check_rmvb_wmv(vpu_reg *reg)
{
- unsigned long type = (reg->reg[3] & 0xF0000000) >> 28;
+ u32 type = (reg->reg[3] & 0xF0000000) >> 28;
return ((type == 8) || (type == 4));
}
static inline bool reg_check_interlace(vpu_reg *reg)
{
return ((type == 8) || (type == 4));
}
static inline bool reg_check_interlace(vpu_reg *reg)
{
- unsigned long type = (reg->reg[3] & (1 << 23));
+ u32 type = (reg->reg[3] & (1 << 23));
reg->type = session->type;
reg->size = size;
reg->freq = VPU_FREQ_DEFAULT;
reg->type = session->type;
reg->size = size;
reg->freq = VPU_FREQ_DEFAULT;
- reg->reg = (unsigned long *)®[1];
+ reg->reg = (u32 *)®[1];
INIT_LIST_HEAD(®->session_link);
INIT_LIST_HEAD(®->status_link);
INIT_LIST_HEAD(®->session_link);
INIT_LIST_HEAD(®->status_link);