Fixed dspbridge
authorPali Rohár <pali.rohar@gmail.com>
Thu, 6 Oct 2011 12:20:14 +0000 (14:20 +0200)
committerPali Rohár <pali.rohar@gmail.com>
Thu, 6 Oct 2011 12:40:55 +0000 (14:40 +0200)
* disabled patch dspbridge_flushall.diff
* added patch dspbridge_omap3.diff (backport from omapzoom kernel-omap3 repository)

kernel-power-2.6.28/debian/changelog
kernel-power-2.6.28/debian/patches/dspbridge_omap3.diff [new file with mode: 0644]
kernel-power-2.6.28/debian/patches/series

index 59907c2..e5c0739 100644 (file)
@@ -14,7 +14,7 @@ kernel-power (1:2.6.28-10power49) fremantle; urgency=low
   *   DSS video memory is increased from 6 to 8 megabytes, allowing DSS scaler to rescale HD videos (including 1280x720)
   *   add support for for CONFIG_BRIDGE_NEW_API
   *   fix DSP cache when is incoherent with main memory, which leads to memory errors
-  *   add FLUSHALL DSP ioctl code
+  *   backport fixes from omapzoom kernel-omap3
   * added new patches:
   *   adding-ramzswap-driver.diff
   *   patch_swap_notify_core_support_2_2.6.28.diff
diff --git a/kernel-power-2.6.28/debian/patches/dspbridge_omap3.diff b/kernel-power-2.6.28/debian/patches/dspbridge_omap3.diff
new file mode 100644 (file)
index 0000000..52bf88d
--- /dev/null
@@ -0,0 +1,207 @@
+diff -urN kernel-power-2.6.28/arch/arm/plat-omap/mailbox.c kernel-power-2.6.28.new/arch/arm/plat-omap/mailbox.c
+--- kernel-power-2.6.28/arch/arm/plat-omap/mailbox.c   2011-10-03 21:46:25.000000000 +0100
++++ kernel-power-2.6.28.new/arch/arm/plat-omap/mailbox.c       2011-10-03 20:15:03.000000000 +0100
+@@ -34,7 +34,7 @@
+ static struct omap_mbox *mboxes;
+ static DEFINE_RWLOCK(mboxes_lock);
+-
++static bool rq_full;
+ /*
+  * Mailbox sequence bit API
+  */
+@@ -219,6 +219,10 @@
+       while (1) {
+               spin_lock_irqsave(q->queue_lock, flags);
+               rq = elv_next_request(q);
++              if (rq_full) {
++                      omap_mbox_enable_irq(mbox, IRQ_RX);
++                      rq_full = false;
++              }
+               spin_unlock_irqrestore(q->queue_lock, flags);
+               if (!rq)
+                       break;
+@@ -227,8 +231,8 @@
+               if (blk_end_request(rq, 0, 0))
+                       BUG();
+-
+-              mbox->rxq->callback((void *)msg);
++              if(mbox->rxq->callback)
++                  mbox->rxq->callback((void *)msg);
+       }
+ }
+@@ -260,8 +264,11 @@
+       while (!mbox_fifo_empty(mbox)) {
+               rq = blk_get_request(q, WRITE, GFP_ATOMIC);
+-              if (unlikely(!rq))
++              if (unlikely(!rq)){
++                      omap_mbox_disable_irq(mbox, IRQ_RX);
++                      rq_full = true;
+                       goto nomem;
++              }
+               msg = mbox_fifo_read(mbox);
+               rq->data = (void *)msg;
+@@ -446,11 +453,12 @@
+ static void omap_mbox_fini(struct omap_mbox *mbox)
+ {
++      free_irq(mbox->irq, mbox);
++      tasklet_kill(&mbox->txq->tasklet);
++      flush_work(&mbox->rxq->work);
+       mbox_queue_free(mbox->txq);
+       mbox_queue_free(mbox->rxq);
+-      free_irq(mbox->irq, mbox);
+-
+       if (unlikely(mbox->ops->shutdown))
+               mbox->ops->shutdown(mbox);
+ }
+diff -urN kernel-power-2.6.28/drivers/dsp/bridge/rmgr/drv.c kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/drv.c
+--- kernel-power-2.6.28/drivers/dsp/bridge/rmgr/drv.c  2011-10-03 21:46:33.000000000 +0100
++++ kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/drv.c      2011-10-03 21:30:40.000000000 +0100
+@@ -77,7 +77,6 @@
+ /* GPP PROCESS CLEANUP CODE */
+ static DSP_STATUS DRV_ProcFreeNodeRes(HANDLE hPCtxt);
+-static DSP_STATUS  DRV_ProcFreeSTRMRes(HANDLE hPCtxt);
+ extern enum NODE_STATE NODE_GetState(HANDLE hNode);
+ /* Allocate and add a node resource element
+@@ -290,7 +289,7 @@
+               pDMMList = pDMMList->next;
+               if (pDMMRes->dmmAllocated) {
+                       status = PROC_UnMap(pDMMRes->hProcessor,
+-                               (void *)pDMMRes->ulDSPResAddr, pCtxt);
++                               (void *)pDMMRes->ulDSPAddr, pCtxt);
+                       if (DSP_FAILED(status))
+                               pr_debug("%s: PROC_UnMap failed! status ="
+                                               " 0x%xn", __func__, status);
+@@ -489,60 +488,45 @@
+       return status;
+ }
+-/* Actual Stream De-Allocation */
+-static DSP_STATUS  DRV_ProcFreeSTRMRes(HANDLE hPCtxt)
+-{
++/* Release all Stream resources and its context
++* This is called from .bridge_release.
++*/
++DSP_STATUS DRV_RemoveAllSTRMResElements(HANDLE hPCtxt){
+       struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
+       DSP_STATUS status = DSP_SOK;
+-      u8 **apBuffer = NULL;
+-      struct STRM_RES_OBJECT *pSTRMRes = NULL;
++      struct STRM_RES_OBJECT *strm_res = NULL;
++      struct STRM_RES_OBJECT *strm_tmp = NULL;        
+       struct STRM_INFO strm_info;
+       struct DSP_STREAMINFO user;
++      u8 **apBuffer = NULL;
+       u8 *pBufPtr;
+       u32 ulBytes;
+       u32 dwArg;
+       s32 ulBufSize;
+-      pSTRMRes = pCtxt->pSTRMList;
+-      while (pSTRMRes) {
+-              if (pSTRMRes->uNumBufs) {
+-                      apBuffer = MEM_Alloc(pSTRMRes->uNumBufs *
+-                                          sizeof(u8 *), MEM_NONPAGED);
+-                      if (!apBuffer)
+-                              return DSP_EMEMORY;
+-                      status = STRM_FreeBuffer(pSTRMRes->hStream, apBuffer,
+-                                              pSTRMRes->uNumBufs, pCtxt);
+-                      MEM_Free(apBuffer);
++      strm_tmp = pCtxt->pSTRMList;
++      while (strm_tmp) {
++              strm_res = strm_tmp;
++              strm_tmp = strm_tmp->next;
++              if (strm_res->uNumBufs) {
++                      apBuffer = MEM_Alloc((strm_res->uNumBufs *
++                                              sizeof(u8 *)), MEM_NONPAGED);
++                      status = STRM_FreeBuffer(strm_res->hStream, apBuffer,
++                                              strm_res->uNumBufs, pCtxt);
++                      if (apBuffer) {
++                              status = STRM_FreeBuffer(strm_res->hStream,
++                                      apBuffer, strm_res->uNumBufs, pCtxt);
++                              MEM_Free(apBuffer);
++                      }
+               }
+               strm_info.pUser = &user;
+               user.uNumberBufsInStream = 0;
+-              STRM_GetInfo(pSTRMRes->hStream, &strm_info, sizeof(strm_info));
+-              while (strm_info.pUser->uNumberBufsInStream--)
+-                      STRM_Reclaim(pSTRMRes->hStream, &pBufPtr, &ulBytes,
+-                                           (u32 *)&ulBufSize, &dwArg);
+-
+-      }
+-      return status;
+-}
+-
+-/* Release all Stream resources and its context
+-* This is called from .bridge_release.
+-*/
+-DSP_STATUS    DRV_RemoveAllSTRMResElements(HANDLE hPCtxt)
+-{
+-      struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
+-      DSP_STATUS status = DSP_SOK;
+-      struct STRM_RES_OBJECT *pTempSTRMRes2 = NULL;
+-      struct STRM_RES_OBJECT *pTempSTRMRes = NULL;
+-
+-      DRV_ProcFreeSTRMRes(pCtxt);
+-      pTempSTRMRes = pCtxt->pSTRMList;
+-      while (pTempSTRMRes != NULL) {
+-              pTempSTRMRes2 = pTempSTRMRes;
+-              pTempSTRMRes = pTempSTRMRes->next;
+-              MEM_Free(pTempSTRMRes2);
++              STRM_GetInfo(strm_res->hStream, &strm_info, sizeof(strm_info));
++              while (user.uNumberBufsInStream--)
++                      STRM_Reclaim(strm_res->hStream, &pBufPtr, &ulBytes,
++                                          (u32 *)&ulBufSize, &dwArg);
++              status = STRM_Close(strm_res->hStream, pCtxt);
+       }
+-      pCtxt->pSTRMList = NULL;
+       return status;
+ }
+diff -urN kernel-power-2.6.28/drivers/dsp/bridge/rmgr/node.c kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/node.c
+--- kernel-power-2.6.28/drivers/dsp/bridge/rmgr/node.c 2011-10-03 21:46:33.000000000 +0100
++++ kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/node.c     2011-10-03 20:17:41.000000000 +0100
+@@ -3170,7 +3170,7 @@
+                pNodeId, pNodeProps);
+       status = PROC_GetDevObject(hProcessor, &hDevObject);
+-      if (hDevObject != NULL)
++      if (hDevObject)
+               status = DEV_GetNodeManager(hDevObject, &hNodeMgr);
+       if (hNodeMgr == NULL) {
+diff -urN kernel-power-2.6.28/drivers/dsp/bridge/rmgr/proc.c kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/proc.c
+--- kernel-power-2.6.28/drivers/dsp/bridge/rmgr/proc.c 2011-10-03 21:46:33.000000000 +0100
++++ kernel-power-2.6.28.new/drivers/dsp/bridge/rmgr/proc.c     2011-10-03 20:21:33.000000000 +0100
+@@ -351,13 +351,11 @@
+               status = DEV_GetWMDContext(hDevObject,
+                                       &pProcObject->hWmdContext);
+               if (DSP_FAILED(status)) {
+-                      MEM_FreeObject(hProcObject);
+                       GT_0trace(PROC_DebugMask, GT_7CLASS,
+                                "PROC_AutoStart: Failed "
+                                "to get WMD Context \n");
+               }
+       } else {
+-              MEM_FreeObject(hProcObject);
+               GT_0trace(PROC_DebugMask, GT_7CLASS,
+                        "PROC_AutoStart: Failed to "
+                        "get IntFxns \n");
+@@ -408,6 +406,8 @@
+               GT_0trace(PROC_DebugMask, GT_7CLASS, "PROC_AutoStart: "
+                        "No Exec file found \n");
+       }
++      MEM_Free(hProcObject->g_pszLastCoff);
++      hProcObject->g_pszLastCoff = NULL;
+ func_cont:
+       MEM_FreeObject(hProcObject);
+ func_end:
index 2aadc20..ea5afa3 100644 (file)
@@ -49,7 +49,8 @@ joikuspot.diff
 dspbridge.diff
 dspbridge_ioctl_buffer_overrun.diff
 dspbridge_new_api.diff
-dspbridge_flushall.diff
+#dspbridge_flushall.diff
+dspbridge_omap3.diff
 phys_to_page.diff
 ext4-data-corruption.diff
 patch_swap_notify_core_support_2.6.28.diff