kernel-drm: fix thumbernail scrambled issue when IED is enabled
authorFei Jiang <fei.jiang@intel.com>
Wed, 9 May 2012 13:50:17 +0000 (21:50 +0800)
committerbuildbot <buildbot@intel.com>
Thu, 17 May 2012 08:46:47 +0000 (01:46 -0700)
BZ: 32464

Video kernel driver need query DRM_CNTL_STATE register to know whether IED is enabled. Then return the state to user space driver.
When widevine is running, IED will be enabled and video surface will be encrypted. So CPU will only get scambled image.
For that case, need return error for vaDeriveImage and vaGetImage.

Change-Id: I9da4dfa88af241fb0729695b4e9e8266e8583bb0
Reviewed-on: http://android.intel.com:8080/48098
Reviewed-by: Jiang, Fei <fei.jiang@intel.com>
Reviewed-by: Sun, Mingruo <mingruo.sun@intel.com>
Reviewed-by: Qiu, Junhai <junhai.qiu@intel.com>
Reviewed-by: Ding, Haitao <haitao.ding@intel.com>
Tested-by: Ding, Haitao <haitao.ding@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
drivers/staging/mrst/drv/psb_drm.h
drivers/staging/mrst/drv/psb_drv.h
drivers/staging/mrst/imgv/psb_msvdx.c

index 47a3e46..72291dc 100644 (file)
@@ -275,7 +275,8 @@ typedef enum {
        IMG_VIDEO_GET_HDMI_STATE,
        IMG_VIDEO_SET_HDMI_STATE,
        PNW_VIDEO_QUERY_ENTRY,
-       IMG_DISPLAY_SET_WIDI_EXT_STATE
+       IMG_DISPLAY_SET_WIDI_EXT_STATE,
+       IMG_VIDEO_IED_STATE
 } lnc_getparam_key_t;
 
 struct drm_lnc_video_getparam_arg {
index 10d3073..12e02c0 100644 (file)
@@ -168,6 +168,10 @@ enum panel_type {
 
 #define MRST_MSVDX_OFFSET      0x90000 /*MSVDX Base offset */
 #define PSB_MSVDX_OFFSET       0x50000 /*MSVDX Base offset */
+
+#define PSB_IED_DRM_CNTL_STATUS                0x2208
+#define IED_DRM_VLD                    (1<<0)
+
 /* MSVDX MMIO region is 0x50000 - 0x57fff ==> 32KB */
 #define PSB_MSVDX_SIZE         0x10000
 
index 715f45b..382d606 100644 (file)
@@ -859,7 +859,6 @@ loop: /* just for coding style check */
                                                    FW_VA_HW_PANIC_FIRST_MB_NUM);
                        last_mb = MEMIO_READ_FIELD(buf,
                                                   FW_VA_HW_PANIC_FAULT_MB_NUM);
-                       printk("jiangfei debug: fence in panic message is %d.\n", fence);
                        PSB_DEBUG_MSVDX("MSVDX_DEBUG: PANIC MESSAGE fence is %d.\n", MEMIO_READ_FIELD(buf, FW_VA_HW_PANIC_FENCE_VALUE));
                        PSB_DEBUG_MSVDX("MSVDX_DEBUG: PANIC MESSAGE first mb num is %d.\n", MEMIO_READ_FIELD(buf, FW_VA_HW_PANIC_FIRST_MB_NUM));
                        PSB_DEBUG_MSVDX("MSVDX_DEBUG: PANIC MESSAGE fault mb num is %d.\n", MEMIO_READ_FIELD(buf, FW_VA_HW_PANIC_FAULT_MB_NUM));
@@ -1545,6 +1544,29 @@ int lnc_video_getparam(struct drm_device *dev, void *data,
                                        ((unsigned long)arg->value),
                                        &i, sizeof(i));
                break;
+               case IMG_VIDEO_IED_STATE:
+               if (IS_MDFLD(dev)) {
+                       int ied_enable;
+                       /* VXD must be power on during query IED register */
+                       if (!ospm_power_using_hw_begin(OSPM_VIDEO_DEC_ISLAND,
+                                       OSPM_UHB_FORCE_POWER_ON))
+                               return -EBUSY;
+                       /* wrong spec, IED should be located in pci device 2 */
+                       if (REG_READ(PSB_IED_DRM_CNTL_STATUS) & IED_DRM_VLD)
+                               ied_enable = 1;
+                       else
+                               ied_enable = 0;
+                       PSB_DEBUG_GENERAL("ied_enable is %d.\n", ied_enable);
+                       ospm_power_using_hw_end(OSPM_VIDEO_DEC_ISLAND);
+
+                       ret = copy_to_user((void __user *)
+                                       ((unsigned long)arg->value),
+                                       &ied_enable, sizeof(ied_enable));
+               } else { /* Moorestown should not call it */
+                       DRM_ERROR("IMG_VIDEO_IED_EANBLE error.\n");
+                       return -EFAULT;
+               }
+               break;
 
        default:
                ret = -EFAULT;
@@ -1643,3 +1665,4 @@ int psb_msvdx_check_reset_fw(struct drm_device *dev)
 
        return 0;
 }
+