rk3288: hevc, fix bugs in copy registers to userspace
authorljf <ljf@rock-chips.com>
Mon, 24 Mar 2014 06:50:22 +0000 (14:50 +0800)
committerljf <ljf@rock-chips.com>
Mon, 24 Mar 2014 06:51:19 +0000 (14:51 +0800)
arch/arm/mach-rockchip/vcodec_service.c

index 02e574cd1f7681925b9a7fa66e8d720860d712f5..56cac6c852c6a66278ab47e00ab20f61833bc5dd 100755 (executable)
@@ -702,13 +702,14 @@ static void reg_from_run_to_done(struct vpu_service_info *pservice, vpu_reg *reg
        case VPU_ENC : {\r
                pservice->reg_codec = NULL;\r
                reg_copy_from_hw(reg, pservice->enc_dev.hwregs, pservice->hw_info->enc_reg_num);\r
-        irq_reg = ENC_INTERRUPT_REGISTER;\r
+                irq_reg = ENC_INTERRUPT_REGISTER;\r
                break;\r
        }\r
        case VPU_DEC : {\r
+        int reg_len = pservice->hw_info->hw_id == HEVC_ID ? REG_NUM_HEVC_DEC : REG_NUM_9190_DEC;\r
                pservice->reg_codec = NULL;\r
-               reg_copy_from_hw(reg, pservice->dec_dev.hwregs, REG_NUM_9190_DEC);\r
-        irq_reg = DEC_INTERRUPT_REGISTER;\r
+               reg_copy_from_hw(reg, pservice->dec_dev.hwregs, reg_len);\r
+                irq_reg = DEC_INTERRUPT_REGISTER;\r
                break;\r
        }\r
        case VPU_PP : {\r
@@ -964,7 +965,8 @@ static int return_reg(struct vpu_service_info *pservice, vpu_reg *reg, u32 __use
                break;\r
        }\r
        case VPU_DEC : {\r
-               if (copy_to_user(dst, &reg->reg[0], SIZE_REG(REG_NUM_9190_DEC)))\r
+        int reg_len = pservice->hw_info->hw_id == HEVC_ID ? REG_NUM_HEVC_DEC : REG_NUM_9190_DEC;\r
+               if (copy_to_user(dst, &reg->reg[0], reg_len))\r
                        ret = -EFAULT;\r
                break;\r
        }\r
@@ -1357,9 +1359,8 @@ static int vcodec_probe(struct platform_device *pdev)
 \r
     platform_set_drvdata(pdev, pservice);\r
 \r
-    if (pservice->hw_info->hw_id != HEVC_ID) {\r
-        get_hw_info(pservice);\r
-    }\r
+    get_hw_info(pservice);\r
+\r
 \r
 #ifdef CONFIG_DEBUG_FS\r
     pservice->debugfs_dir = vcodec_debugfs_create_device_dir((char*)dev_name(dev), parent);\r
@@ -1485,195 +1486,196 @@ static struct platform_driver vcodec_driver = {
 \r
 static void get_hw_info(struct vpu_service_info *pservice)\r
 {\r
-       VPUHwDecConfig_t *dec = &pservice->dec_config;\r
-       VPUHwEncConfig_t *enc = &pservice->enc_config;\r
-       u32 configReg   = pservice->dec_dev.hwregs[VPU_DEC_HWCFG0];\r
-       u32 asicID      = pservice->dec_dev.hwregs[0];\r
-\r
-       dec->h264Support    = (configReg >> DWL_H264_E) & 0x3U;\r
-       dec->jpegSupport    = (configReg >> DWL_JPEG_E) & 0x01U;\r
-       if (dec->jpegSupport && ((configReg >> DWL_PJPEG_E) & 0x01U))\r
-               dec->jpegSupport = JPEG_PROGRESSIVE;\r
-       dec->mpeg4Support   = (configReg >> DWL_MPEG4_E) & 0x3U;\r
-       dec->vc1Support     = (configReg >> DWL_VC1_E) & 0x3U;\r
-       dec->mpeg2Support   = (configReg >> DWL_MPEG2_E) & 0x01U;\r
-       dec->sorensonSparkSupport = (configReg >> DWL_SORENSONSPARK_E) & 0x01U;\r
-       dec->refBufSupport  = (configReg >> DWL_REF_BUFF_E) & 0x01U;\r
-       dec->vp6Support     = (configReg >> DWL_VP6_E) & 0x01U;\r
-\r
-    if (!soc_is_rk3190() && !soc_is_rk3288()) {\r
-               dec->maxDecPicWidth = configReg & 0x07FFU;\r
-    } else {\r
-               // vpu after rk3190\r
-               dec->maxDecPicWidth = 3840;\r
-       }\r
-\r
-       /* 2nd Config register */\r
-       configReg   = pservice->dec_dev.hwregs[VPU_DEC_HWCFG1];\r
-       if (dec->refBufSupport) {\r
-               if ((configReg >> DWL_REF_BUFF_ILACE_E) & 0x01U)\r
-                       dec->refBufSupport |= 2;\r
-               if ((configReg >> DWL_REF_BUFF_DOUBLE_E) & 0x01U)\r
-                       dec->refBufSupport |= 4;\r
-       }\r
-       dec->customMpeg4Support = (configReg >> DWL_MPEG4_CUSTOM_E) & 0x01U;\r
-       dec->vp7Support     = (configReg >> DWL_VP7_E) & 0x01U;\r
-       dec->vp8Support     = (configReg >> DWL_VP8_E) & 0x01U;\r
-       dec->avsSupport     = (configReg >> DWL_AVS_E) & 0x01U;\r
-\r
-       /* JPEG xtensions */\r
-       if (((asicID >> 16) >= 0x8190U) || ((asicID >> 16) == 0x6731U)) {\r
-               dec->jpegESupport = (configReg >> DWL_JPEG_EXT_E) & 0x01U;\r
-       } else {\r
-               dec->jpegESupport = JPEG_EXT_NOT_SUPPORTED;\r
-       }\r
-\r
-       if (((asicID >> 16) >= 0x9170U) || ((asicID >> 16) == 0x6731U) ) {\r
-               dec->rvSupport = (configReg >> DWL_RV_E) & 0x03U;\r
-       } else {\r
-               dec->rvSupport = RV_NOT_SUPPORTED;\r
-       }\r
-\r
-       dec->mvcSupport = (configReg >> DWL_MVC_E) & 0x03U;\r
-\r
-       if (dec->refBufSupport && (asicID >> 16) == 0x6731U ) {\r
-               dec->refBufSupport |= 8; /* enable HW support for offset */\r
-       }\r
-\r
-    /// invalidate fuse register value in rk319x vpu\r
-    if (!soc_is_rk3190() && !soc_is_rk3288()) {\r
-               VPUHwFuseStatus_t hwFuseSts;\r
-               /* Decoder fuse configuration */\r
-               u32 fuseReg = pservice->dec_dev.hwregs[VPU_DEC_HW_FUSE_CFG];\r
-\r
-               hwFuseSts.h264SupportFuse = (fuseReg >> DWL_H264_FUSE_E) & 0x01U;\r
-               hwFuseSts.mpeg4SupportFuse = (fuseReg >> DWL_MPEG4_FUSE_E) & 0x01U;\r
-               hwFuseSts.mpeg2SupportFuse = (fuseReg >> DWL_MPEG2_FUSE_E) & 0x01U;\r
-               hwFuseSts.sorensonSparkSupportFuse = (fuseReg >> DWL_SORENSONSPARK_FUSE_E) & 0x01U;\r
-               hwFuseSts.jpegSupportFuse = (fuseReg >> DWL_JPEG_FUSE_E) & 0x01U;\r
-               hwFuseSts.vp6SupportFuse = (fuseReg >> DWL_VP6_FUSE_E) & 0x01U;\r
-               hwFuseSts.vc1SupportFuse = (fuseReg >> DWL_VC1_FUSE_E) & 0x01U;\r
-               hwFuseSts.jpegProgSupportFuse = (fuseReg >> DWL_PJPEG_FUSE_E) & 0x01U;\r
-               hwFuseSts.rvSupportFuse = (fuseReg >> DWL_RV_FUSE_E) & 0x01U;\r
-               hwFuseSts.avsSupportFuse = (fuseReg >> DWL_AVS_FUSE_E) & 0x01U;\r
-               hwFuseSts.vp7SupportFuse = (fuseReg >> DWL_VP7_FUSE_E) & 0x01U;\r
-               hwFuseSts.vp8SupportFuse = (fuseReg >> DWL_VP8_FUSE_E) & 0x01U;\r
-               hwFuseSts.customMpeg4SupportFuse = (fuseReg >> DWL_CUSTOM_MPEG4_FUSE_E) & 0x01U;\r
-               hwFuseSts.mvcSupportFuse = (fuseReg >> DWL_MVC_FUSE_E) & 0x01U;\r
-\r
-               /* check max. decoder output width */\r
-\r
-               if (fuseReg & 0x8000U)\r
-                       hwFuseSts.maxDecPicWidthFuse = 1920;\r
-               else if (fuseReg & 0x4000U)\r
-                       hwFuseSts.maxDecPicWidthFuse = 1280;\r
-               else if (fuseReg & 0x2000U)\r
-                       hwFuseSts.maxDecPicWidthFuse = 720;\r
-               else if (fuseReg & 0x1000U)\r
-                       hwFuseSts.maxDecPicWidthFuse = 352;\r
-               else    /* remove warning */\r
-                       hwFuseSts.maxDecPicWidthFuse = 352;\r
-\r
-               hwFuseSts.refBufSupportFuse = (fuseReg >> DWL_REF_BUFF_FUSE_E) & 0x01U;\r
-\r
-               /* Pp configuration */\r
-               configReg = pservice->dec_dev.hwregs[VPU_PP_HW_SYNTH_CFG];\r
-\r
-               if ((configReg >> DWL_PP_E) & 0x01U) {\r
-                       dec->ppSupport = 1;\r
-                       dec->maxPpOutPicWidth = configReg & 0x07FFU;\r
-                       /*pHwCfg->ppConfig = (configReg >> DWL_CFG_E) & 0x0FU; */\r
-                       dec->ppConfig = configReg;\r
-               } else {\r
-                       dec->ppSupport = 0;\r
-                       dec->maxPpOutPicWidth = 0;\r
-                       dec->ppConfig = 0;\r
-               }\r
-\r
-               /* check the HW versio */\r
-               if (((asicID >> 16) >= 0x8190U) || ((asicID >> 16) == 0x6731U)) {\r
-                       /* Pp configuration */\r
-                       configReg = pservice->dec_dev.hwregs[VPU_DEC_HW_FUSE_CFG];\r
-\r
-                       if ((configReg >> DWL_PP_E) & 0x01U) {\r
-                               /* Pp fuse configuration */\r
-                               u32 fuseRegPp = pservice->dec_dev.hwregs[VPU_PP_HW_FUSE_CFG];\r
-\r
-                               if ((fuseRegPp >> DWL_PP_FUSE_E) & 0x01U) {\r
-                                       hwFuseSts.ppSupportFuse = 1;\r
-                                       /* check max. pp output width */\r
-                                       if      (fuseRegPp & 0x8000U) hwFuseSts.maxPpOutPicWidthFuse = 1920;\r
-                                       else if (fuseRegPp & 0x4000U) hwFuseSts.maxPpOutPicWidthFuse = 1280;\r
-                                       else if (fuseRegPp & 0x2000U) hwFuseSts.maxPpOutPicWidthFuse = 720;\r
-                                       else if (fuseRegPp & 0x1000U) hwFuseSts.maxPpOutPicWidthFuse = 352;\r
-                                       else                          hwFuseSts.maxPpOutPicWidthFuse = 352;\r
-                                       hwFuseSts.ppConfigFuse = fuseRegPp;\r
-                               } else {\r
-                                       hwFuseSts.ppSupportFuse = 0;\r
-                                       hwFuseSts.maxPpOutPicWidthFuse = 0;\r
-                                       hwFuseSts.ppConfigFuse = 0;\r
-                               }\r
-                       } else {\r
-                               hwFuseSts.ppSupportFuse = 0;\r
-                               hwFuseSts.maxPpOutPicWidthFuse = 0;\r
-                               hwFuseSts.ppConfigFuse = 0;\r
-                       }\r
-\r
-                       if (dec->maxDecPicWidth > hwFuseSts.maxDecPicWidthFuse)\r
-                               dec->maxDecPicWidth = hwFuseSts.maxDecPicWidthFuse;\r
-                       if (dec->maxPpOutPicWidth > hwFuseSts.maxPpOutPicWidthFuse)\r
-                               dec->maxPpOutPicWidth = hwFuseSts.maxPpOutPicWidthFuse;\r
-                       if (!hwFuseSts.h264SupportFuse) dec->h264Support = H264_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.mpeg4SupportFuse) dec->mpeg4Support = MPEG4_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.customMpeg4SupportFuse) dec->customMpeg4Support = MPEG4_CUSTOM_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.jpegSupportFuse) dec->jpegSupport = JPEG_NOT_SUPPORTED;\r
-                       if ((dec->jpegSupport == JPEG_PROGRESSIVE) && !hwFuseSts.jpegProgSupportFuse)\r
-                               dec->jpegSupport = JPEG_BASELINE;\r
-                       if (!hwFuseSts.mpeg2SupportFuse) dec->mpeg2Support = MPEG2_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.vc1SupportFuse) dec->vc1Support = VC1_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.vp6SupportFuse) dec->vp6Support = VP6_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.vp7SupportFuse) dec->vp7Support = VP7_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.vp8SupportFuse) dec->vp8Support = VP8_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.ppSupportFuse) dec->ppSupport = PP_NOT_SUPPORTED;\r
-\r
-                       /* check the pp config vs fuse status */\r
-                       if ((dec->ppConfig & 0xFC000000) && ((hwFuseSts.ppConfigFuse & 0xF0000000) >> 5)) {\r
-                               u32 deInterlace = ((dec->ppConfig & PP_DEINTERLACING) >> 25);\r
-                               u32 alphaBlend  = ((dec->ppConfig & PP_ALPHA_BLENDING) >> 24);\r
-                               u32 deInterlaceFuse = (((hwFuseSts.ppConfigFuse >> 5) & PP_DEINTERLACING) >> 25);\r
-                               u32 alphaBlendFuse  = (((hwFuseSts.ppConfigFuse >> 5) & PP_ALPHA_BLENDING) >> 24);\r
-\r
-                               if (deInterlace && !deInterlaceFuse) dec->ppConfig &= 0xFD000000;\r
-                               if (alphaBlend && !alphaBlendFuse) dec->ppConfig &= 0xFE000000;\r
-                       }\r
-                       if (!hwFuseSts.sorensonSparkSupportFuse) dec->sorensonSparkSupport = SORENSON_SPARK_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.refBufSupportFuse)   dec->refBufSupport = REF_BUF_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.rvSupportFuse)       dec->rvSupport = RV_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.avsSupportFuse)      dec->avsSupport = AVS_NOT_SUPPORTED;\r
-                       if (!hwFuseSts.mvcSupportFuse)      dec->mvcSupport = MVC_NOT_SUPPORTED;\r
-               }\r
-       }\r
-\r
-       configReg = pservice->enc_dev.hwregs[63];\r
-       enc->maxEncodedWidth = configReg & ((1 << 11) - 1);\r
-       enc->h264Enabled = (configReg >> 27) & 1;\r
-       enc->mpeg4Enabled = (configReg >> 26) & 1;\r
-       enc->jpegEnabled = (configReg >> 25) & 1;\r
-       enc->vsEnabled = (configReg >> 24) & 1;\r
-       enc->rgbEnabled = (configReg >> 28) & 1;\r
-       //enc->busType = (configReg >> 20) & 15;\r
-       //enc->synthesisLanguage = (configReg >> 16) & 15;\r
-       //enc->busWidth = (configReg >> 12) & 15;\r
-       enc->reg_size = pservice->reg_size;\r
-       enc->reserv[0] = enc->reserv[1] = 0;\r
-\r
-       pservice->auto_freq = soc_is_rk2928g() || soc_is_rk2928l() || soc_is_rk2926();\r
-       if (pservice->auto_freq) {\r
-               printk("vpu_service set to auto frequency mode\n");\r
-               atomic_set(&pservice->freq_status, VPU_FREQ_BUT);\r
-       }\r
-       pservice->bug_dec_addr = cpu_is_rk30xx();\r
-       //printk("cpu 3066b bug %d\n", service.bug_dec_addr);\r
+    if (pservice->dev_id == VCODEC_DEVICE_ID_VPU) {\r
+        VPUHwDecConfig_t *dec = &pservice->dec_config;\r
+        VPUHwEncConfig_t *enc = &pservice->enc_config;\r
+        u32 configReg   = pservice->dec_dev.hwregs[VPU_DEC_HWCFG0];\r
+        u32 asicID      = pservice->dec_dev.hwregs[0];\r
+    \r
+        dec->h264Support    = (configReg >> DWL_H264_E) & 0x3U;\r
+        dec->jpegSupport    = (configReg >> DWL_JPEG_E) & 0x01U;\r
+        if (dec->jpegSupport && ((configReg >> DWL_PJPEG_E) & 0x01U))\r
+            dec->jpegSupport = JPEG_PROGRESSIVE;\r
+        dec->mpeg4Support   = (configReg >> DWL_MPEG4_E) & 0x3U;\r
+        dec->vc1Support     = (configReg >> DWL_VC1_E) & 0x3U;\r
+        dec->mpeg2Support   = (configReg >> DWL_MPEG2_E) & 0x01U;\r
+        dec->sorensonSparkSupport = (configReg >> DWL_SORENSONSPARK_E) & 0x01U;\r
+        dec->refBufSupport  = (configReg >> DWL_REF_BUFF_E) & 0x01U;\r
+        dec->vp6Support     = (configReg >> DWL_VP6_E) & 0x01U;\r
+    \r
+        if (!soc_is_rk3190() && !soc_is_rk3288()) {\r
+            dec->maxDecPicWidth = configReg & 0x07FFU;\r
+        } else {\r
+            dec->maxDecPicWidth = 3840;\r
+        }\r
+    \r
+        /* 2nd Config register */\r
+        configReg   = pservice->dec_dev.hwregs[VPU_DEC_HWCFG1];\r
+        if (dec->refBufSupport) {\r
+            if ((configReg >> DWL_REF_BUFF_ILACE_E) & 0x01U)\r
+                dec->refBufSupport |= 2;\r
+            if ((configReg >> DWL_REF_BUFF_DOUBLE_E) & 0x01U)\r
+                dec->refBufSupport |= 4;\r
+        }\r
+        dec->customMpeg4Support = (configReg >> DWL_MPEG4_CUSTOM_E) & 0x01U;\r
+        dec->vp7Support     = (configReg >> DWL_VP7_E) & 0x01U;\r
+        dec->vp8Support     = (configReg >> DWL_VP8_E) & 0x01U;\r
+        dec->avsSupport     = (configReg >> DWL_AVS_E) & 0x01U;\r
+    \r
+        /* JPEG xtensions */\r
+        if (((asicID >> 16) >= 0x8190U) || ((asicID >> 16) == 0x6731U)) {\r
+            dec->jpegESupport = (configReg >> DWL_JPEG_EXT_E) & 0x01U;\r
+        } else {\r
+            dec->jpegESupport = JPEG_EXT_NOT_SUPPORTED;\r
+        }\r
+    \r
+        if (((asicID >> 16) >= 0x9170U) || ((asicID >> 16) == 0x6731U) ) {\r
+            dec->rvSupport = (configReg >> DWL_RV_E) & 0x03U;\r
+        } else {\r
+            dec->rvSupport = RV_NOT_SUPPORTED;\r
+        }\r
+    \r
+        dec->mvcSupport = (configReg >> DWL_MVC_E) & 0x03U;\r
+    \r
+        if (dec->refBufSupport && (asicID >> 16) == 0x6731U ) {\r
+            dec->refBufSupport |= 8; /* enable HW support for offset */\r
+        }\r
+    \r
+        /// invalidate fuse register value in rk319x vpu and following.\r
+        if (!soc_is_rk3190() && !soc_is_rk3288()) {\r
+            VPUHwFuseStatus_t hwFuseSts;\r
+            /* Decoder fuse configuration */\r
+            u32 fuseReg = pservice->dec_dev.hwregs[VPU_DEC_HW_FUSE_CFG];\r
+    \r
+            hwFuseSts.h264SupportFuse = (fuseReg >> DWL_H264_FUSE_E) & 0x01U;\r
+            hwFuseSts.mpeg4SupportFuse = (fuseReg >> DWL_MPEG4_FUSE_E) & 0x01U;\r
+            hwFuseSts.mpeg2SupportFuse = (fuseReg >> DWL_MPEG2_FUSE_E) & 0x01U;\r
+            hwFuseSts.sorensonSparkSupportFuse = (fuseReg >> DWL_SORENSONSPARK_FUSE_E) & 0x01U;\r
+            hwFuseSts.jpegSupportFuse = (fuseReg >> DWL_JPEG_FUSE_E) & 0x01U;\r
+            hwFuseSts.vp6SupportFuse = (fuseReg >> DWL_VP6_FUSE_E) & 0x01U;\r
+            hwFuseSts.vc1SupportFuse = (fuseReg >> DWL_VC1_FUSE_E) & 0x01U;\r
+            hwFuseSts.jpegProgSupportFuse = (fuseReg >> DWL_PJPEG_FUSE_E) & 0x01U;\r
+            hwFuseSts.rvSupportFuse = (fuseReg >> DWL_RV_FUSE_E) & 0x01U;\r
+            hwFuseSts.avsSupportFuse = (fuseReg >> DWL_AVS_FUSE_E) & 0x01U;\r
+            hwFuseSts.vp7SupportFuse = (fuseReg >> DWL_VP7_FUSE_E) & 0x01U;\r
+            hwFuseSts.vp8SupportFuse = (fuseReg >> DWL_VP8_FUSE_E) & 0x01U;\r
+            hwFuseSts.customMpeg4SupportFuse = (fuseReg >> DWL_CUSTOM_MPEG4_FUSE_E) & 0x01U;\r
+            hwFuseSts.mvcSupportFuse = (fuseReg >> DWL_MVC_FUSE_E) & 0x01U;\r
+    \r
+            /* check max. decoder output width */\r
+    \r
+            if (fuseReg & 0x8000U)\r
+                hwFuseSts.maxDecPicWidthFuse = 1920;\r
+            else if (fuseReg & 0x4000U)\r
+                hwFuseSts.maxDecPicWidthFuse = 1280;\r
+            else if (fuseReg & 0x2000U)\r
+                hwFuseSts.maxDecPicWidthFuse = 720;\r
+            else if (fuseReg & 0x1000U)\r
+                hwFuseSts.maxDecPicWidthFuse = 352;\r
+            else    /* remove warning */\r
+                hwFuseSts.maxDecPicWidthFuse = 352;\r
+    \r
+            hwFuseSts.refBufSupportFuse = (fuseReg >> DWL_REF_BUFF_FUSE_E) & 0x01U;\r
+    \r
+            /* Pp configuration */\r
+            configReg = pservice->dec_dev.hwregs[VPU_PP_HW_SYNTH_CFG];\r
+    \r
+            if ((configReg >> DWL_PP_E) & 0x01U) {\r
+                dec->ppSupport = 1;\r
+                dec->maxPpOutPicWidth = configReg & 0x07FFU;\r
+                /*pHwCfg->ppConfig = (configReg >> DWL_CFG_E) & 0x0FU; */\r
+                dec->ppConfig = configReg;\r
+            } else {\r
+                dec->ppSupport = 0;\r
+                dec->maxPpOutPicWidth = 0;\r
+                dec->ppConfig = 0;\r
+            }\r
+    \r
+            /* check the HW versio */\r
+            if (((asicID >> 16) >= 0x8190U) || ((asicID >> 16) == 0x6731U))    {\r
+                /* Pp configuration */\r
+                configReg = pservice->dec_dev.hwregs[VPU_DEC_HW_FUSE_CFG];\r
+    \r
+                if ((configReg >> DWL_PP_E) & 0x01U) {\r
+                    /* Pp fuse configuration */\r
+                    u32 fuseRegPp = pservice->dec_dev.hwregs[VPU_PP_HW_FUSE_CFG];\r
+    \r
+                    if ((fuseRegPp >> DWL_PP_FUSE_E) & 0x01U) {\r
+                        hwFuseSts.ppSupportFuse = 1;\r
+                        /* check max. pp output width */\r
+                        if      (fuseRegPp & 0x8000U) hwFuseSts.maxPpOutPicWidthFuse = 1920;\r
+                        else if (fuseRegPp & 0x4000U) hwFuseSts.maxPpOutPicWidthFuse = 1280;\r
+                        else if (fuseRegPp & 0x2000U) hwFuseSts.maxPpOutPicWidthFuse = 720;\r
+                        else if (fuseRegPp & 0x1000U) hwFuseSts.maxPpOutPicWidthFuse = 352;\r
+                        else                          hwFuseSts.maxPpOutPicWidthFuse = 352;\r
+                        hwFuseSts.ppConfigFuse = fuseRegPp;\r
+                    } else {\r
+                        hwFuseSts.ppSupportFuse = 0;\r
+                        hwFuseSts.maxPpOutPicWidthFuse = 0;\r
+                        hwFuseSts.ppConfigFuse = 0;\r
+                    }\r
+                } else {\r
+                    hwFuseSts.ppSupportFuse = 0;\r
+                    hwFuseSts.maxPpOutPicWidthFuse = 0;\r
+                    hwFuseSts.ppConfigFuse = 0;\r
+                }\r
+    \r
+                if (dec->maxDecPicWidth > hwFuseSts.maxDecPicWidthFuse)\r
+                    dec->maxDecPicWidth = hwFuseSts.maxDecPicWidthFuse;\r
+                if (dec->maxPpOutPicWidth > hwFuseSts.maxPpOutPicWidthFuse)\r
+                    dec->maxPpOutPicWidth = hwFuseSts.maxPpOutPicWidthFuse;\r
+                if (!hwFuseSts.h264SupportFuse) dec->h264Support = H264_NOT_SUPPORTED;\r
+                if (!hwFuseSts.mpeg4SupportFuse) dec->mpeg4Support = MPEG4_NOT_SUPPORTED;\r
+                if (!hwFuseSts.customMpeg4SupportFuse) dec->customMpeg4Support = MPEG4_CUSTOM_NOT_SUPPORTED;\r
+                if (!hwFuseSts.jpegSupportFuse) dec->jpegSupport = JPEG_NOT_SUPPORTED;\r
+                if ((dec->jpegSupport == JPEG_PROGRESSIVE) && !hwFuseSts.jpegProgSupportFuse)\r
+                    dec->jpegSupport = JPEG_BASELINE;\r
+                if (!hwFuseSts.mpeg2SupportFuse) dec->mpeg2Support = MPEG2_NOT_SUPPORTED;\r
+                if (!hwFuseSts.vc1SupportFuse) dec->vc1Support = VC1_NOT_SUPPORTED;\r
+                if (!hwFuseSts.vp6SupportFuse) dec->vp6Support = VP6_NOT_SUPPORTED;\r
+                if (!hwFuseSts.vp7SupportFuse) dec->vp7Support = VP7_NOT_SUPPORTED;\r
+                if (!hwFuseSts.vp8SupportFuse) dec->vp8Support = VP8_NOT_SUPPORTED;\r
+                if (!hwFuseSts.ppSupportFuse) dec->ppSupport = PP_NOT_SUPPORTED;\r
+    \r
+                /* check the pp config vs fuse status */\r
+                if ((dec->ppConfig & 0xFC000000) && ((hwFuseSts.ppConfigFuse & 0xF0000000) >> 5)) {\r
+                    u32 deInterlace = ((dec->ppConfig & PP_DEINTERLACING) >> 25);\r
+                    u32 alphaBlend  = ((dec->ppConfig & PP_ALPHA_BLENDING) >> 24);\r
+                    u32 deInterlaceFuse = (((hwFuseSts.ppConfigFuse >> 5) & PP_DEINTERLACING) >> 25);\r
+                    u32 alphaBlendFuse  = (((hwFuseSts.ppConfigFuse >> 5) & PP_ALPHA_BLENDING) >> 24);\r
+    \r
+                    if (deInterlace && !deInterlaceFuse) dec->ppConfig &= 0xFD000000;\r
+                    if (alphaBlend && !alphaBlendFuse) dec->ppConfig &= 0xFE000000;\r
+                }\r
+                if (!hwFuseSts.sorensonSparkSupportFuse) dec->sorensonSparkSupport = SORENSON_SPARK_NOT_SUPPORTED;\r
+                if (!hwFuseSts.refBufSupportFuse)   dec->refBufSupport = REF_BUF_NOT_SUPPORTED;\r
+                if (!hwFuseSts.rvSupportFuse)       dec->rvSupport = RV_NOT_SUPPORTED;\r
+                if (!hwFuseSts.avsSupportFuse)      dec->avsSupport = AVS_NOT_SUPPORTED;\r
+                if (!hwFuseSts.mvcSupportFuse)      dec->mvcSupport = MVC_NOT_SUPPORTED;\r
+            }\r
+        }\r
+    \r
+        configReg = pservice->enc_dev.hwregs[63];\r
+        enc->maxEncodedWidth = configReg & ((1 << 11) - 1);\r
+        enc->h264Enabled = (configReg >> 27) & 1;\r
+        enc->mpeg4Enabled = (configReg >> 26) & 1;\r
+        enc->jpegEnabled = (configReg >> 25) & 1;\r
+        enc->vsEnabled = (configReg >> 24) & 1;\r
+        enc->rgbEnabled = (configReg >> 28) & 1;\r
+        //enc->busType = (configReg >> 20) & 15;\r
+        //enc->synthesisLanguage = (configReg >> 16) & 15;\r
+        //enc->busWidth = (configReg >> 12) & 15;\r
+        enc->reg_size = pservice->reg_size;\r
+        enc->reserv[0] = enc->reserv[1] = 0;\r
+    \r
+        pservice->auto_freq = soc_is_rk2928g() || soc_is_rk2928l() || soc_is_rk2926();\r
+        if (pservice->auto_freq) {\r
+            pr_info("vpu_service set to auto frequency mode\n");\r
+            atomic_set(&pservice->freq_status, VPU_FREQ_BUT);\r
+        }\r
+        pservice->bug_dec_addr = cpu_is_rk30xx();\r
+        //printk("cpu 3066b bug %d\n", service.bug_dec_addr);\r
+    }\r
 }\r
 \r
 static irqreturn_t vdpu_irq(int irq, void *dev_id)\r