Video: port R2 kernel driver to R3/ICS
authorLi, Ruigang <ruigangx.li@intel.com>
Tue, 27 Dec 2011 09:03:09 +0000 (17:03 +0800)
committerbuildbot <buildbot@intel.com>
Sun, 1 Jan 2012 22:30:29 +0000 (14:30 -0800)
BZ: 18528

The porting changes some files in drv/ directory

Change-Id: I709e50c9d8f3d52d1f65ce8b00ad78a21d7afe17
Signed-off-by: Li, Ruigang <ruigangx.li@intel.com>
Reviewed-on: http://android.intel.com:8080/30017
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.c [changed mode: 0755->0644]
drivers/staging/mrst/drv/psb_drv.h [changed mode: 0755->0644]
drivers/staging/mrst/drv/psb_gtt.c
drivers/staging/mrst/drv/psb_irq.c
drivers/staging/mrst/drv/psb_powermgmt.c [changed mode: 0755->0644]
drivers/staging/mrst/drv/psb_reg.h
drivers/staging/mrst/drv/psb_reset.c
drivers/staging/mrst/drv/psb_sgx.c

index 8ba5dad..7ba6a4d 100644 (file)
@@ -43,7 +43,7 @@
  * c - Hotfix Release
  * xxxx - Graphics internal build #
  */
-#define PSB_PACKAGE_VERSION "5.6.0.1152"
+#define PSB_PACKAGE_VERSION "5.6.0.1153"
 
 #define DRM_PSB_SAREA_MAJOR 0
 #define DRM_PSB_SAREA_MINOR 2
@@ -264,7 +264,6 @@ typedef enum {
        LNC_VIDEO_DEVICE_INFO,
        LNC_VIDEO_GETPARAM_RAR_INFO,
        LNC_VIDEO_GETPARAM_CI_INFO,
-       LNC_VIDEO_GETPARAM_RAR_HANDLER_OFFSET,
        LNC_VIDEO_FRAME_SKIP,
        IMG_VIDEO_DECODE_STATUS,
        IMG_VIDEO_NEW_CONTEXT,
old mode 100755 (executable)
new mode 100644 (file)
index 120276a..8cbe5d7
 #ifdef CONFIG_GFX_RTPM
 #include <linux/pm_runtime.h>
 #endif
-#if defined(CONFIG_RAR_REGISTER)
-#include "../../rar_register/rar_register.h"
-#include "../../memrar/memrar.h"
-#endif
 
 #include <asm/intel_scu_ipc.h>
 
@@ -601,31 +597,6 @@ static void get_ci_info(struct drm_psb_private *dev_priv)
        return;
 }
 
-static void get_rar_info(struct drm_psb_private *dev_priv)
-{
-#if defined(CONFIG_RAR_REGISTER)
-       int ret;
-       dma_addr_t start_addr, end_addr;
-
-       dev_priv->rar_region_start = 0;
-       dev_priv->rar_region_size = 0;
-       end_addr = 0;
-       ret = 0;
-
-       ret = rar_get_address(RAR_TYPE_VIDEO, &start_addr,
-                             &end_addr);
-       if (ret) {
-               printk(KERN_ERR "failed to get rar region info\n");
-               return;
-       }
-       dev_priv->rar_region_start = (uint32_t) start_addr;
-       if ((!ret) && (start_addr != 0) && (end_addr != 0))
-               dev_priv->rar_region_size =
-                       end_addr - dev_priv->rar_region_start + 1;
-
-#endif
-       return;
-}
 
 
 static void get_imr_info(struct drm_psb_private *dev_priv)
@@ -633,22 +604,23 @@ static void get_imr_info(struct drm_psb_private *dev_priv)
        u32 high, low, start, end;
        int size = 0;
 
-       low = MDFLD_MSG_READ32(PNW_IMR_MSG_PORT, PNW_IMR3L_MSG_REGADDR);
-       high = MDFLD_MSG_READ32(PNW_IMR_MSG_PORT, PNW_IMR3H_MSG_REGADDR);
+       low = MDFLD_MSG_READ32(PNW_IMR_MSG_PORT, PNW_IMR4L_MSG_REGADDR);
+       high = MDFLD_MSG_READ32(PNW_IMR_MSG_PORT, PNW_IMR4H_MSG_REGADDR);
        start = (low & PNW_IMR_ADDRESS_MASK) << PNW_IMR_ADDRESS_SHIFT;
        end = (high & PNW_IMR_ADDRESS_MASK) << PNW_IMR_ADDRESS_SHIFT;
        if (end > start)
                size = end - start + 1;
        if (size > 0) {
                dev_priv->rar_region_start = start;
-               dev_priv->rar_region_size = size;
+               dev_priv->rar_region_size = size & PAGE_MASK;
        } else {
                dev_priv->rar_region_start = 0;
                dev_priv->rar_region_size = 0;
        }
-       DRM_INFO("IMR3 start=0x%08x, size=%dB\n",
+       DRM_INFO("IMR4 start=0x%08x, size=%dB (%d pages)\n",
                dev_priv->rar_region_start,
-               dev_priv->rar_region_size);
+               dev_priv->rar_region_size,
+               dev_priv->rar_region_size >> PAGE_SHIFT);
        return;
 }
 
@@ -1185,6 +1157,7 @@ static int psb_do_init(struct drm_device *dev)
        struct ttm_bo_device *bdev = &dev_priv->bdev;
        struct psb_gtt *pg = dev_priv->pg;
 
+       uint32_t tmp;
        uint32_t stolen_gtt;
        uint32_t tt_start;
        uint32_t tt_pages;
@@ -1241,42 +1214,30 @@ static int psb_do_init(struct drm_device *dev)
        tt_pages -= tt_start >> PAGE_SHIFT;
        dev_priv->sizes.ta_mem_size = 0;
 
-#ifdef CONFIG_MDFD_VIDEO_DECODE
-
+       /* CI region managed by TTM */
+       tmp = dev_priv->ci_region_size >> PAGE_SHIFT; /* CI region size */
        if (IS_MRST(dev) &&
            (dev_priv->ci_region_size != 0) &&
-           !ttm_bo_init_mm(bdev, TTM_PL_CI,
-                           dev_priv->ci_region_size >> PAGE_SHIFT)) {
+           !ttm_bo_init_mm(bdev, TTM_PL_CI, tmp))
                dev_priv->have_camera = 1;
-       }
 
-       /* since there is always rar region for video, it is ok */
+       /* RAR region managed by TTM */
+       tmp = dev_priv->rar_region_size >> PAGE_SHIFT; /* RAR region size */
        if ((dev_priv->rar_region_size != 0) &&
-           !ttm_bo_init_mm(bdev, TTM_PL_RAR,
-                           dev_priv->rar_region_size >> PAGE_SHIFT)) {
+           !ttm_bo_init_mm(bdev, TTM_PL_RAR, tmp))
                dev_priv->have_rar = 1;
-       }
 
        /* TT region managed by TTM. */
-       if (!ttm_bo_init_mm(bdev, TTM_PL_TT,
-                           pg->gatt_pages -
-                           (pg->ci_start >> PAGE_SHIFT) -
-                           ((dev_priv->ci_region_size + dev_priv->rar_region_size)
-                            >> PAGE_SHIFT))) {
-
+       tmp = pg->gatt_pages -
+               (pg->ci_start >> PAGE_SHIFT) -
+               (dev_priv->ci_region_size >> PAGE_SHIFT); /* TT region size */
+       if (!ttm_bo_init_mm(bdev, TTM_PL_TT, tmp))
                dev_priv->have_tt = 1;
-               dev_priv->sizes.tt_size =
-                       (tt_pages << PAGE_SHIFT) / (1024 * 1024) / 2;
-       }
 
-       if (!ttm_bo_init_mm(bdev,
-                           DRM_PSB_MEM_MMU,
-                           PSB_MEM_TT_START >> PAGE_SHIFT)) {
+       /* MMU region managed by TTM */
+       tmp = PSB_MEM_RAR_START >> PAGE_SHIFT; /* MMU region size:MMU->RAR */
+       if (!ttm_bo_init_mm(bdev, DRM_PSB_MEM_MMU, tmp))
                dev_priv->have_mem_mmu = 1;
-               dev_priv->sizes.mmu_size =
-                       PSB_MEM_TT_START / (1024 * 1024);
-       }
-
 
        PSB_DEBUG_INIT("Init MSVDX\n");
        psb_msvdx_init(dev);
@@ -1291,7 +1252,6 @@ static int psb_do_init(struct drm_device *dev)
                else
                        ospm_power_island_down(OSPM_VIDEO_ENC_ISLAND);
        }
-#endif
 
        return 0;
 out_err:
@@ -1563,10 +1523,8 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
 
        PSB_DEBUG_INIT("Init TTM fence and BO driver\n");
 
-       if (IS_MRST(dev)) {
+       if (IS_MRST(dev))
                get_ci_info(dev_priv);
-               get_rar_info(dev_priv);
-       }
         if (IS_MDFLD(dev))
                get_imr_info(dev_priv);
 
@@ -1657,7 +1615,7 @@ static int psb_driver_load(struct drm_device *dev, unsigned long chipset)
                ret = psb_mmu_insert_pfn_sequence(
                              psb_mmu_get_default_pd(dev_priv->mmu),
                              dev_priv->rar_region_start >> PAGE_SHIFT,
-                             pg->mmu_gatt_start + pg->rar_start,
+                             PSB_MEM_RAR_START,
                              pg->rar_stolen_size >> PAGE_SHIFT, 0);
                up_read(&pg->sem);
                if (ret)
old mode 100755 (executable)
new mode 100644 (file)
index 2aca879..86a813e
@@ -1530,7 +1530,7 @@ do {                                                \
 #define IS_MSVDX(dev) (IS_MRST(dev) || IS_MDFLD(dev))
 #define IS_TOPAZ(dev) ((IS_MRST(dev) && (((dev)->pci_device & 0xfffc) != PCI_ID_TOPAZ_DISABLED)) || IS_MDFLD(dev))
 
-#define IS_D0(dev) ((dev)->pdev->revision == 0xc)
+#define IS_D0(dev) ((dev)->pdev->revision >= 0xc)
 
 extern int drm_psb_ospm;
 extern int drm_psb_cpurelax;
index 53d2ecf..aaa411a 100644 (file)
@@ -205,21 +205,6 @@ int psb_gtt_init(struct psb_gtt *pg, int resume)
                pte = psb_gtt_mask_pte(pfn_base + i, 0);
                iowrite32(pte, ttm_gtt_map + i);
        }
-
-       /*
-        * insert RAR stolen pages
-        */
-       if (rar_stolen_size != 0) {
-               pfn_base = dev_priv->rar_region_start >> PAGE_SHIFT;
-               num_pages = rar_stolen_size >> PAGE_SHIFT;
-               printk(KERN_INFO"Set up %d RAR stolen pages starting at 0x%08x, GTT offset %dK\n",
-                      num_pages, pfn_base,
-                      (ttm_gtt_map - pg->gtt_map + i) * 4);
-               for (; i < num_pages + ci_pages; ++i) {
-                       pte = psb_gtt_mask_pte(pfn_base + i - ci_pages, 0);
-                       iowrite32(pte, ttm_gtt_map + i);
-               }
-       }
        /*
         * Init rest of gtt managed by TTM.
         */
index b031c2d..33eec68 100644 (file)
@@ -507,37 +507,41 @@ irqreturn_t psb_irq_handler(DRM_IRQ_ARGS)
        vdc_stat &= dev_priv->vdc_irq_mask;
        spin_unlock_irqrestore(&dev_priv->irqmask_lock, irq_flags);
 
+       /*
+               Ignore interrupt if sub-system is already
+               powered gated; nothing needs to be done,
+               when HW is already power-gated
+               - saftey check to avoid illegal HW access.
+       */
        if (dsp_int && ospm_power_is_hw_on(OSPM_DISPLAY_ISLAND)) {
                psb_vdc_interrupt(dev, vdc_stat);
                handled = 1;
        }
 
 #ifdef CONFIG_MDFD_VIDEO_DECODE
-       if (msvdx_int && (IS_MDFLD(dev)
-                         || ospm_power_is_hw_on(OSPM_VIDEO_DEC_ISLAND))) {
+       if (msvdx_int && IS_MDFLD(dev)
+                         && ospm_power_is_hw_on(OSPM_VIDEO_DEC_ISLAND)) {
                psb_msvdx_interrupt(dev);
                handled = 1;
        }
 
-       if ((IS_MDFLD(dev) && topaz_int)) {
+       if ((IS_MDFLD(dev) && topaz_int
+                       && ospm_power_is_hw_on(OSPM_VIDEO_ENC_ISLAND))) {
                pnw_topaz_interrupt(dev);
                handled = 1;
        } else if (IS_MRST(dev) && topaz_int &&
                   ospm_power_is_hw_on(OSPM_VIDEO_ENC_ISLAND)) {
-               /* sometimes, even topaz power down, IIR
-                * may still have topaz bit set
-                */
                lnc_topaz_interrupt(dev);
                handled = 1;
        }
 #endif
-       if (sgx_int) {
+       if (sgx_int && ospm_power_is_hw_on(OSPM_GRAPHICS_ISLAND)) {
                if (SYSPVRServiceSGXInterrupt(dev) != 0)
                        handled = 1;
        }
 
 #ifdef CONFIG_MDFD_GL3
-       if (gl3_int) {
+       if (gl3_int && ospm_power_is_hw_on(OSPM_GL3_CACHE_ISLAND)) {
                mdfld_gl3_interrupt(dev, vdc_stat);
                handled = 1;
        }
old mode 100755 (executable)
new mode 100644 (file)
index d197486..4140ccd
@@ -1922,9 +1922,12 @@ void ospm_power_island_up(int hw_islands)
                If pmu_nc_set_power_state fails then accessing HW
                reg would result in a crash - IERR/Fabric error.
                */
+               spin_lock_irqsave(&dev_priv->ospm_lock, flags);
                if (pmu_nc_set_power_state(dc_islands,
                        OSPM_ISLAND_UP, OSPM_REG_TYPE))
                        BUG();
+               g_hw_power_status_mask |= OSPM_DISPLAY_ISLAND;
+               spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
 
                /* handle other islands */
                gfx_islands = hw_islands & ~OSPM_DISPLAY_ISLAND;
@@ -1939,14 +1942,25 @@ void ospm_power_island_up(int hw_islands)
                If pmu_nc_set_power_state fails then accessing HW
                reg would result in a crash - IERR/Fabric error.
                */
+
+               if (IS_D0(gpDrmDevice)) {
+                       /*
+                        * GL3 power island needs to be on for MSVDX working.
+                        * We found this during enabling new MSVDX firmware
+                        * uploading mechanism(by PUNIT) for Penwell D0.
+                        */
+                       if ((gfx_islands & OSPM_VIDEO_DEC_ISLAND) &&
+                                       !ospm_power_is_hw_on(OSPM_GL3_CACHE_ISLAND))
+                               gfx_islands |= OSPM_GL3_CACHE_ISLAND;
+               }
+
+               spin_lock_irqsave(&dev_priv->ospm_lock, flags);
                if (pmu_nc_set_power_state(gfx_islands,
-                               OSPM_ISLAND_UP, APM_REG_TYPE))
+                                          OSPM_ISLAND_UP, APM_REG_TYPE))
                        BUG();
+               g_hw_power_status_mask |= gfx_islands;
+               spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
        }
-
-       spin_lock_irqsave(&dev_priv->ospm_lock, flags);
-       g_hw_power_status_mask |= hw_islands;
-       spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
 }
 /*
  * ospm_power_resume
@@ -1997,10 +2011,6 @@ void ospm_power_island_down(int hw_islands)
        struct drm_psb_private *dev_priv =
                (struct drm_psb_private *) gpDrmDevice->dev_private;
 
-       spin_lock_irqsave(&dev_priv->ospm_lock, flags);
-       g_hw_power_status_mask &= ~hw_islands;
-       spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
-
 #ifdef OSPM_GFX_DPK
        printk(KERN_ALERT "%s hw_islands: %x\n",
                __func__, hw_islands);
@@ -2017,9 +2027,13 @@ void ospm_power_island_down(int hw_islands)
                If pmu_nc_set_power_state fails then accessing HW
                reg would result in a crash - IERR/Fabric error.
                */
+               spin_lock_irqsave(&dev_priv->ospm_lock, flags);
+               g_hw_power_status_mask &= ~OSPM_DISPLAY_ISLAND;
                if (pmu_nc_set_power_state(dc_islands,
-                       OSPM_ISLAND_DOWN, OSPM_REG_TYPE))
+                                          OSPM_ISLAND_DOWN, OSPM_REG_TYPE))
                        BUG();
+               spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
+
 #ifdef CONFIG_MDFD_HDMI
                /* Turn off MSIC VCC330 and VHDMI if HDMI is disconnected. */
                if (!hdmi_state) {
@@ -2037,38 +2051,39 @@ void ospm_power_island_down(int hw_islands)
                printk(KERN_ALERT "%s other hw_islands: %x\n",
                         __func__, gfx_islands);
 #endif
+               spin_lock_irqsave(&dev_priv->ospm_lock, flags);
                if (gfx_islands & OSPM_GL3_CACHE_ISLAND) {
                        /*
                        Make sure both GFX & Video aren't
                        using GL3
                        */
                        if (atomic_read(&g_graphics_access_count) ||
-                               ospm_power_is_hw_on(OSPM_VIDEO_DEC_ISLAND) ||
-                               ospm_power_is_hw_on(OSPM_VIDEO_ENC_ISLAND) ||
-                               (drm_psb_gl3_enable == 0)) {
+                                       (g_hw_power_status_mask &
+                                       (OSPM_VIDEO_DEC_ISLAND |
+                                       OSPM_VIDEO_ENC_ISLAND |
+                                       OSPM_GRAPHICS_ISLAND)) ||
+                                       (drm_psb_gl3_enable == 0)) {
 #ifdef OSPM_GFX_DPK
                                printk(KERN_ALERT
                                "%s GL3 in use - can't turn OFF\n",
                                __func__);
 #endif
-
                                gfx_islands &=  ~OSPM_GL3_CACHE_ISLAND;
-                               /*restore the mask back*/
-                               spin_lock_irqsave(&dev_priv->ospm_lock, flags);
-                               g_hw_power_status_mask |= OSPM_GL3_CACHE_ISLAND;
-                               spin_unlock_irqrestore(
-                                       &dev_priv->ospm_lock, flags);
                                if (!gfx_islands)
-                                       return;
+                                       goto out;
                        }
                }
+
                /*
                If pmu_nc_set_power_state fails then accessing HW
                reg would result in a crash - IERR/Fabric error.
                */
+               g_hw_power_status_mask &= ~gfx_islands;
                if (pmu_nc_set_power_state(gfx_islands,
                        OSPM_ISLAND_DOWN, APM_REG_TYPE))
                        BUG();
+out:
+               spin_unlock_irqrestore(&dev_priv->ospm_lock, flags);
        }
 }
 
@@ -2194,8 +2209,18 @@ bool ospm_power_using_hw_begin(int hw_island, UHBUsage usage)
                                        /* printk(KERN_ALERT "%s power on video decode\n", __func__); */
                                        deviceID = gui32MRSTMSVDXDeviceID;
 #ifdef CONFIG_MDFD_GL3
-                                       ospm_power_island_up(OSPM_VIDEO_DEC_ISLAND);
-                                       ospm_power_island_up(OSPM_GL3_CACHE_ISLAND);
+                                       ospm_power_island_up(OSPM_GL3_CACHE_ISLAND | OSPM_VIDEO_DEC_ISLAND);
+                                       if (IS_D0(gpDrmDevice)) {
+                                               struct drm_psb_private *dev_priv =
+                                                       (struct drm_psb_private *) gpDrmDevice->dev_private;
+                                               int ret;
+
+                                               ret = psb_wait_for_register(dev_priv, MSVDX_COMMS_SIGNATURE,
+                                                                           MSVDX_COMMS_SIGNATURE_VALUE,
+                                                                           0xffffffff);
+                                               if (ret)
+                                                       DRM_ERROR("MSVDX: firmware fails to initialize.\n");
+                                       }
 #else
                                        ospm_power_island_up(OSPM_VIDEO_DEC_ISLAND);
 #endif
@@ -2209,16 +2234,14 @@ bool ospm_power_using_hw_begin(int hw_island, UHBUsage usage)
 
                                break;
                        case OSPM_VIDEO_ENC_ISLAND:
-                               if(!ospm_power_is_hw_on(OSPM_DISPLAY_ISLAND)) {
-                                       /* printk(KERN_ALERT "%s power on display for video encode\n", __func__); */
+                               if (IS_MRST(gpDrmDevice) &&
+                                               (!ospm_power_is_hw_on(
+                                                       OSPM_DISPLAY_ISLAND))) {
                                        deviceID = gui32MRSTDisplayDeviceID;
                                        ospm_resume_display(pdev);
                                        psb_irq_preinstall_islands(gpDrmDevice, OSPM_DISPLAY_ISLAND);
                                        psb_irq_postinstall_islands(gpDrmDevice, OSPM_DISPLAY_ISLAND);
                                }
-                               else{
-                                       /* printk(KERN_ALERT "%s display is already on for video encode use\n", __func__); */
-                               }
 
                                if(!ospm_power_is_hw_on(OSPM_VIDEO_ENC_ISLAND)) {
                                        /* printk(KERN_ALERT "%s power on video encode\n", __func__); */
index f295d66..d3e87fe 100644 (file)
 #define PNW_IMR_ADDRESS_MASK 0x00fffffcu
 #define PNW_IMR_ADDRESS_SHIFT 8
 #define PNW_IMR_MSG_PORT      3
-#define PNW_IMR3L_MSG_REGADDR 0x4C
-#define PNW_IMR3H_MSG_REGADDR 0x4D
+#define PNW_IMR4L_MSG_REGADDR 0x50
+#define PNW_IMR4H_MSG_REGADDR 0x51
 
 #endif
index 8bfdf87..ab5a870 100644 (file)
@@ -96,7 +96,11 @@ static void psb_msvdx_reset_wq(struct work_struct *work)
        unsigned long irq_flags;
 
        mutex_lock(&msvdx_priv->msvdx_mutex);
-       msvdx_priv->msvdx_needs_reset = 1;
+       if (IS_D0(dev_priv->dev))
+               msvdx_priv->msvdx_needs_reset |= MSVDX_RESET_NEEDS_REUPLOAD_FW |
+                       MSVDX_RESET_NEEDS_INIT_FW;
+       else
+               msvdx_priv->msvdx_needs_reset = 1;
        msvdx_priv->msvdx_current_sequence++;
        PSB_DEBUG_GENERAL
        ("MSVDXFENCE: incremented msvdx_current_sequence to :%d\n",
index da79fd1..b6c9ddd 100644 (file)
@@ -817,6 +817,8 @@ int psb_cmdbuf_ioctl(struct drm_device *dev, void *data,
                return ret;
 
        if (arg->engine == PSB_ENGINE_VIDEO) {
+               if (IS_D0(dev))
+                       psb_msvdx_check_reset_fw(dev);
                if (!ospm_power_using_hw_begin(OSPM_VIDEO_DEC_ISLAND,
                                               OSPM_UHB_FORCE_POWER_ON))
                        return -EBUSY;