From: Li Zeng <li.z...@intel.com>

1. Optimize GL3 invalidation for video, only invalidates
   when flush msvdx/topaz mmu cache
2. Modify GL3 register value, clean bit GL3_IGN_VEC_HINT
3. Modify GFX OSPM code to avoid power-off
   GL3 island because video is still using GL3, this is a
   work around before we get a idea on how to power-off GL3

Signed-off-by: Li Zeng <li.z...@intel.com>
Signed-off-by: Hitesh K. Patel <hitesh.k.pa...@intel.com>
---
 drivers/staging/mrst/drv/mdfld_gl3.h      |    2 +-
 drivers/staging/mrst/drv/psb_powermgmt.c  |   22 ++++++++++++++++------
 drivers/staging/mrst/drv/psb_reg.h        |    1 +
 drivers/staging/mrst/drv/psb_sgx.c        |   15 ++++++++-------
 drivers/staging/mrst/imgv/pnw_topaz.c     |    2 --
 drivers/staging/mrst/imgv/pnw_topazinit.c |    1 +
 drivers/staging/mrst/imgv/psb_msvdx.c     |    3 +--
 7 files changed, 28 insertions(+), 18 deletions(-)

diff --git a/drivers/staging/mrst/drv/mdfld_gl3.h 
b/drivers/staging/mrst/drv/mdfld_gl3.h
index 35f9e34..02bdf54 100644
--- a/drivers/staging/mrst/drv/mdfld_gl3.h
+++ b/drivers/staging/mrst/drv/mdfld_gl3.h
@@ -102,7 +102,7 @@
 #define MDFLD_GL3_ENABLE_CACHE (MDFLD_GL3_BYP_PREQ2_USSE3 | 
MDLFD_GL3_BYP_PREQ2_USSE2 | \
                MDFLD_GL3_BYP_PREQ1_USE1 | MDFLD_GL3_BYP_PREQ1_USE0 | 
MDFLD_GL3_BYP_PREQ1_ISPZ  | \
                MDFLD_GL3_BYP_PREQ1_PBE | MDFLD_GL3_BYP_PREQ1_VDM | 
MDFLD_GL3_BYP_PREQ1_TA | \
-               MDFLD_GL3_BYP_PREQ1_MMU | MDFLD_GL3_IGN_VEC_HINT)
+               MDFLD_GL3_BYP_PREQ1_MMU)
 
 #define MDFLD_GL3_INVALIDATE_CACHE (MDFLD_GL3_ENABLE_CACHE | 
MDFLD_GL3_INVALIDATE)
 
diff --git a/drivers/staging/mrst/drv/psb_powermgmt.c 
b/drivers/staging/mrst/drv/psb_powermgmt.c
index b6765db..8c50579 100644
--- a/drivers/staging/mrst/drv/psb_powermgmt.c
+++ b/drivers/staging/mrst/drv/psb_powermgmt.c
@@ -1684,12 +1684,22 @@ void ospm_power_island_up(int hw_islands)
             #endif
                }
                if (hw_islands & OSPM_VIDEO_ENC_ISLAND) {
-                       pwr_cnt &= ~PSB_PWRGT_VID_ENC_MASK;
-                       pwr_mask |= PSB_PWRGT_VID_ENC_MASK;
+                       if (IS_MDFLD(gpDrmDevice) && dev_priv->platform_rev_id 
!= MDFLD_PNW_A0) {
+                               pwr_cnt &= ~(PSB_PWRGT_VID_ENC_MASK | 
PSB_PWRGT_GL3_MASK);
+                               pwr_mask |= (PSB_PWRGT_VID_ENC_MASK | 
PSB_PWRGT_GL3_MASK);
+                       } else {
+                               pwr_cnt &= ~PSB_PWRGT_VID_ENC_MASK;
+                               pwr_mask |= PSB_PWRGT_VID_ENC_MASK;
+                       }
                }
                if (hw_islands & OSPM_VIDEO_DEC_ISLAND) {
-            pwr_cnt &= ~PSB_PWRGT_VID_DEC_MASK;
-                       pwr_mask |= PSB_PWRGT_VID_DEC_MASK;
+                       if (IS_MDFLD(gpDrmDevice) && dev_priv->platform_rev_id 
!= MDFLD_PNW_A0) {
+                               pwr_cnt &= ~(PSB_PWRGT_VID_DEC_MASK | 
PSB_PWRGT_GL3_MASK);
+                               pwr_mask |= (PSB_PWRGT_VID_DEC_MASK | 
PSB_PWRGT_GL3_MASK);
+                       } else {
+                               pwr_cnt &= ~PSB_PWRGT_VID_DEC_MASK;
+                               pwr_mask |= PSB_PWRGT_VID_DEC_MASK;
+                       }
                }
 
                outl(pwr_cnt, dev_priv->apm_base + PSB_APM_CMD);
@@ -1786,8 +1796,8 @@ void ospm_power_island_down(int islands)
 
        if (islands & OSPM_GRAPHICS_ISLAND) {
                if (IS_MDFLD(gpDrmDevice) && dev_priv->platform_rev_id != 
MDFLD_PNW_A0) {
-                       pwr_cnt |= PSB_PWRGT_GFX_MASK_B0;
-                       pwr_mask |= PSB_PWRGT_GFX_MASK_B0;
+                       pwr_cnt |= PSB_PWRGT_GFX_MASK;
+                       pwr_mask |= PSB_PWRGT_GFX_MASK;
                } else {
                        pwr_cnt |= PSB_PWRGT_GFX_MASK;
                        pwr_mask |= PSB_PWRGT_GFX_MASK;
diff --git a/drivers/staging/mrst/drv/psb_reg.h 
b/drivers/staging/mrst/drv/psb_reg.h
index 0c110c2..cbe5405 100644
--- a/drivers/staging/mrst/drv/psb_reg.h
+++ b/drivers/staging/mrst/drv/psb_reg.h
@@ -563,6 +563,7 @@
 #define PSB_APM_STS                0x04
 #define PSB_PWRGT_VID_ENC_MASK     0x30
 #define PSB_PWRGT_VID_DEC_MASK     0xc
+#define PSB_PWRGT_GL3_MASK         0xc0
 
 #define PSB_PM_SSC                 0x20
 #define PSB_PM_SSS                 0x30
diff --git a/drivers/staging/mrst/drv/psb_sgx.c 
b/drivers/staging/mrst/drv/psb_sgx.c
index 563c65c..fdb164f 100644
--- a/drivers/staging/mrst/drv/psb_sgx.c
+++ b/drivers/staging/mrst/drv/psb_sgx.c
@@ -330,11 +330,11 @@ static int psb_validate_buffer_list(struct drm_file 
*file_priv,
                 placement.num_busy_placement = 0;
                 placement.fpfn = 0;
                 placement.lpfn = 0;
-
+               /*
                 ret = ttm_bo_validate(bo, &placement, 1, 0, 0);
                if (unlikely(ret != 0))
                        goto out_err;
-
+               */
                fence_types |= cur_fence_type;
                entry->new_sync_obj_arg = (void *)
                        (unsigned long) cur_fence_type;
@@ -955,21 +955,22 @@ void psb_gl3_global_invalidation(struct drm_device *dev)
 {
 #ifdef CONFIG_MDFD_GL3
        struct drm_psb_private *dev_priv = dev->dev_private;
-       uint32_t gl3_ctl, gl3_stat, poll_count = 0x1000;
+       uint32_t gl3_ctl;
+       /* uint32_t poll_count = 0x1000, gl3_stat; */
 
        /* IS there a way to avoid multiple invalidation simultaneously? Maybe 
a ATOM value */
 
        gl3_ctl = PSB_RVDC32(PSB_GL3_CACHE_CTL);
-       //gl3_ctl = PSB_RVDC32(0xb0000);
-       //printk("GCL_CR_CTL2 is 0x%08x\n", gl3_ctl);
+       /* gl3_ctl = PSB_RVDC32(0xb0000); */
+       /* printk("gl3_invalidation: GCL_CR_CTL2 is 0x%08x\n", gl3_ctl); */
 
        PSB_WVDC32(gl3_ctl | 0x2, PSB_GL3_CACHE_CTL);
 
+#if 0
        while(poll_count) {
                gl3_stat = PSB_RVDC32(PSB_GL3_CACHE_STAT);
                if(gl3_stat & 0x1) {
                        PSB_WVDC32(gl3_stat | 0x1, PSB_GL3_CACHE_STAT); /* 
Frome D.Will : write 1 to Inval_done bit to clear it */
-                       //return 0;
                        return;
                }
                cpu_relax();
@@ -977,6 +978,6 @@ void psb_gl3_global_invalidation(struct drm_device *dev)
        }
 
        DRM_ERROR("Invalidation GL3 timeout\n");
-       //return -1;
+#endif
 #endif
 }
diff --git a/drivers/staging/mrst/imgv/pnw_topaz.c 
b/drivers/staging/mrst/imgv/pnw_topaz.c
index 3f884a5..5795bf8 100644
--- a/drivers/staging/mrst/imgv/pnw_topaz.c
+++ b/drivers/staging/mrst/imgv/pnw_topaz.c
@@ -428,8 +428,6 @@ pnw_topaz_send(struct drm_device *dev, void *cmd,
 
        PSB_DEBUG_GENERAL("TOPAZ: send the command in the buffer one by one\n");
 
-       psb_gl3_global_invalidation(dev);
-
        while (cmd_size > 0) {
                cur_cmd_header = (struct topaz_cmd_header *) command;
                cur_cmd_id = cur_cmd_header->id;
diff --git a/drivers/staging/mrst/imgv/pnw_topazinit.c 
b/drivers/staging/mrst/imgv/pnw_topazinit.c
index 3ce367c..cf6b70a 100644
--- a/drivers/staging/mrst/imgv/pnw_topazinit.c
+++ b/drivers/staging/mrst/imgv/pnw_topazinit.c
@@ -1704,6 +1704,7 @@ void pnw_topaz_mmu_flushcache(struct drm_psb_private 
*dev_priv)
        mmu_control &= (~F_ENCODE(1, TOPAZ_CR_MMU_INVALDC));
        //mmu_control &= (~F_ENCODE(1, TOPAZ_CR_MMU_FLUSH));
        TOPAZ_WRITE32(TOPAZ_CR_MMU_CONTROL0, mmu_control, 0);
+       psb_gl3_global_invalidation(dev_priv->dev);
 }
 
 #if DEBUG_FUNCTION
diff --git a/drivers/staging/mrst/imgv/psb_msvdx.c 
b/drivers/staging/mrst/imgv/psb_msvdx.c
index 81f27f2..ea16fb5 100644
--- a/drivers/staging/mrst/imgv/psb_msvdx.c
+++ b/drivers/staging/mrst/imgv/psb_msvdx.c
@@ -129,6 +129,7 @@ static int psb_msvdx_map_command(struct drm_device *dev,
                                        flags = MEMIO_READ_FIELD(cmd, 
FW_DEVA_DECODE_FLAGS);
                                        flags |= FW_DEVA_INVALIDATE_MMU;
                                        MEMIO_WRITE_FIELD(cmd, 
FW_DEVA_DECODE_FLAGS, flags);
+                                       psb_gl3_global_invalidation(dev);
                                }
 
                                PSB_DEBUG_GENERAL("MSVDX:Set MMU invalidate\n");
@@ -442,8 +443,6 @@ static int psb_msvdx_send(struct drm_device *dev, void *cmd,
        int ret = 0;
        struct drm_psb_private *dev_priv = dev->dev_private;
 
-       psb_gl3_global_invalidation(dev);
-
        while (cmd_size > 0) {
                uint32_t cur_cmd_size = MEMIO_READ_FIELD(cmd, FWRK_GENMSG_SIZE);
                uint32_t cur_cmd_id = MEMIO_READ_FIELD(cmd, FWRK_GENMSG_ID);
-- 
1.7.1

_______________________________________________
MeeGo-kernel mailing list
MeeGo-kernel@lists.meego.com
http://lists.meego.com/listinfo/meego-kernel

Reply via email to