From 654649699d45e6270f725943a40742dcacdf0fff Mon Sep 17 00:00:00 2001 From: =?utf8?q?Pali=20Roh=C3=A1r?= Date: Thu, 6 Oct 2011 14:20:14 +0200 Subject: [PATCH] Fixed dspbridge * disabled patch dspbridge_flushall.diff * added patch dspbridge_omap3.diff (backport from omapzoom kernel-omap3 repository) --- kernel-power-2.6.28/debian/changelog | 2 +- .../debian/patches/dspbridge_omap3.diff | 207 ++++++++++++++++++++ kernel-power-2.6.28/debian/patches/series | 3 +- 3 files changed, 210 insertions(+), 2 deletions(-) create mode 100644 kernel-power-2.6.28/debian/patches/dspbridge_omap3.diff diff --git a/kernel-power-2.6.28/debian/changelog b/kernel-power-2.6.28/debian/changelog index 59907c2..e5c0739 100644 --- a/kernel-power-2.6.28/debian/changelog +++ b/kernel-power-2.6.28/debian/changelog @@ -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 index 0000000..52bf88d --- /dev/null +++ b/kernel-power-2.6.28/debian/patches/dspbridge_omap3.diff @@ -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: diff --git a/kernel-power-2.6.28/debian/patches/series b/kernel-power-2.6.28/debian/patches/series index 2aadc20..ea5afa3 100644 --- a/kernel-power-2.6.28/debian/patches/series +++ b/kernel-power-2.6.28/debian/patches/series @@ -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 -- 1.7.9.5