rk3288: modify vcodec driver to meet request of new vpu version
authorljf <ljf@rock-chips.com>
Sat, 22 Mar 2014 07:57:12 +0000 (15:57 +0800)
committerljf <ljf@rock-chips.com>
Sat, 22 Mar 2014 07:57:12 +0000 (15:57 +0800)
arch/arm/mach-rockchip/vcodec_service.c

index 7961462c93bbd2dc6cf7b43d389e4a8e781f0c7e..02e574cd1f7681925b9a7fa66e8d720860d712f5 100755 (executable)
@@ -1500,12 +1500,13 @@ static void get_hw_info(struct vpu_service_info *pservice)
        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
-#if !defined(CONFIG_ARCH_RK319X)\r
-    /// invalidate max decode picture width value in rk319x vpu\r
-       dec->maxDecPicWidth = configReg & 0x07FFU;\r
-#else\r
-    dec->maxDecPicWidth = 3840;\r
-#endif\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
@@ -1539,121 +1540,120 @@ static void get_hw_info(struct vpu_service_info *pservice)
                dec->refBufSupport |= 8; /* enable HW support for offset */\r
        }\r
 \r
-#if !defined(CONFIG_ARCH_RK319X)\r
     /// invalidate fuse register value in rk319x vpu\r
-       {\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
+    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
-       /* 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
+               configReg = pservice->dec_dev.hwregs[VPU_PP_HW_SYNTH_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
+                       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
-               } 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
+                       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
-               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
-#endif\r
+\r
        configReg = pservice->enc_dev.hwregs[63];\r
        enc->maxEncodedWidth = configReg & ((1 << 11) - 1);\r
        enc->h264Enabled = (configReg >> 27) & 1;\r