1 diff -rupN kernel-power-2.6.28.orig/arch/arm/plat-omap/include/dspbridge/dbdefs.h kernel-power-2.6.28/arch/arm/plat-omap/include/dspbridge/dbdefs.h
2 --- kernel-power-2.6.28.orig/arch/arm/plat-omap/include/dspbridge/dbdefs.h 2011-05-12 20:03:00.000000000 +0100
3 +++ kernel-power-2.6.28/arch/arm/plat-omap/include/dspbridge/dbdefs.h 2011-05-12 21:06:45.000000000 +0100
5 PROC_INVALIDATE_MEM = 0,
7 PROC_WRITEBACK_INVALIDATE_MEM,
11 /* Memory Segment Status Values */
12 diff -rupN kernel-power-2.6.28.orig/arch/arm/plat-omap/include/dspbridge/mem.h kernel-power-2.6.28/arch/arm/plat-omap/include/dspbridge/mem.h
13 --- kernel-power-2.6.28.orig/arch/arm/plat-omap/include/dspbridge/mem.h 2011-05-12 20:03:00.000000000 +0100
14 +++ kernel-power-2.6.28/arch/arm/plat-omap/include/dspbridge/mem.h 2011-05-12 21:07:22.000000000 +0100
15 @@ -137,7 +137,7 @@ do { \
17 * Cache is synchronized
19 - extern void MEM_FlushCache(void *pMemBuf, u32 cBytes, s32 FlushType);
20 + extern void MEM_FlushCache(void *pMemBuf, u32 cBytes, u32 FlushType);
23 * ======== MEM_Free ========
24 diff -rupN kernel-power-2.6.28.orig/drivers/dsp/bridge/pmgr/wcd.c kernel-power-2.6.28/drivers/dsp/bridge/pmgr/wcd.c
25 --- kernel-power-2.6.28.orig/drivers/dsp/bridge/pmgr/wcd.c 2011-05-12 20:01:58.000000000 +0100
26 +++ kernel-power-2.6.28/drivers/dsp/bridge/pmgr/wcd.c 2011-05-12 21:08:06.000000000 +0100
27 @@ -795,7 +795,7 @@ u32 PROCWRAP_FlushMemory(union Trapped_A
30 if (args->ARGS_PROC_FLUSHMEMORY.ulFlags >
31 - PROC_WRITEBACK_INVALIDATE_MEM)
33 return DSP_EINVALIDARG;
35 status = PROC_FlushMemory(args->ARGS_PROC_FLUSHMEMORY.hProcessor,
36 @@ -1216,7 +1216,7 @@ bool validate_node_handle(struct NODE_OB
39 struct PROCESS_CONTEXT *pCtxt = pr_ctxt;
40 - struct NODE_RES_OBJECT *pNode = pCtxt->pNodeList;
41 + struct NODE_RES_OBJECT *pNode;
43 if (hNode == (struct NODE_OBJECT *) DSP_HGPPNODE)
45 @@ -1224,6 +1224,7 @@ bool validate_node_handle(struct NODE_OB
46 if (mutex_lock_interruptible(&pCtxt->node_mutex))
49 + pNode = pCtxt->pNodeList;
50 while (pNode && !retVal) {
51 if (hNode == pNode->hNode)
53 @@ -1683,11 +1684,12 @@ bool validate_strm_handle(struct STRM_OB
56 struct PROCESS_CONTEXT *pCtxt = pr_ctxt;
57 - struct STRM_RES_OBJECT *pStrm = pCtxt->pSTRMList;
58 + struct STRM_RES_OBJECT *pStrm;
60 if (mutex_lock_interruptible(&pCtxt->strm_mutex))
63 + pStrm = pCtxt->pSTRMList;
64 while (pStrm && !retVal) {
65 if (hStrm == pStrm->hStream)
67 diff -rupN kernel-power-2.6.28.orig/drivers/dsp/bridge/rmgr/drv.c kernel-power-2.6.28/drivers/dsp/bridge/rmgr/drv.c
68 --- kernel-power-2.6.28.orig/drivers/dsp/bridge/rmgr/drv.c 2011-05-12 20:01:58.000000000 +0100
69 +++ kernel-power-2.6.28/drivers/dsp/bridge/rmgr/drv.c 2011-05-12 20:41:01.000000000 +0100
70 @@ -97,8 +97,10 @@ DSP_STATUS DRV_InsertNodeResElement(HAND
73 if (DSP_SUCCEEDED(status)) {
74 - if (mutex_lock_interruptible(&pCtxt->node_mutex))
75 + if (mutex_lock_interruptible(&pCtxt->node_mutex)) {
76 + MEM_Free(*pNodeRes);
79 (*pNodeRes)->hNode = hNode;
80 if (pCtxt->pNodeList != NULL) {
81 pTempNodeRes = pCtxt->pNodeList;
82 @@ -208,8 +210,10 @@ DSP_STATUS DRV_InsertDMMResElement(HANDL
85 if (DSP_SUCCEEDED(status)) {
86 - if (mutex_lock_interruptible(&pCtxt->dmm_mutex))
87 + if (mutex_lock_interruptible(&pCtxt->dmm_mutex)) {
92 if (pCtxt->pDMMList != NULL) {
93 GT_0trace(curTrace, GT_5CLASS,
94 @@ -439,8 +443,10 @@ DSP_STATUS DRV_ProcInsertSTRMResElement(
97 if (DSP_SUCCEEDED(status)) {
98 - if (mutex_lock_interruptible(&pCtxt->strm_mutex))
99 + if (mutex_lock_interruptible(&pCtxt->strm_mutex)) {
100 + MEM_Free(*pSTRMRes);
103 (*pSTRMRes)->hStream = hStreamHandle;
104 if (pCtxt->pSTRMList != NULL) {
105 GT_0trace(curTrace, GT_ENTER,
106 diff -rupN kernel-power-2.6.28.orig/drivers/dsp/bridge/rmgr/proc.c kernel-power-2.6.28/drivers/dsp/bridge/rmgr/proc.c
107 --- kernel-power-2.6.28.orig/drivers/dsp/bridge/rmgr/proc.c 2011-05-12 20:01:58.000000000 +0100
108 +++ kernel-power-2.6.28/drivers/dsp/bridge/rmgr/proc.c 2011-05-12 21:10:35.000000000 +0100
109 @@ -564,43 +564,8 @@ DSP_STATUS PROC_EnumNodes(void *hProcess
113 -/* Cache operation against kernel address instead of users */
114 -static int memory_sync_page(struct vm_area_struct *vma, unsigned long start,
115 - ssize_t len, enum DSP_FLUSHTYPE ftype)
119 - unsigned long offset;
123 - page = follow_page(vma, start, FOLL_GET);
125 - pr_err("%s: no page for %08lx\n", __func__, start);
127 - } else if (IS_ERR(page)) {
128 - pr_err("%s: err page for %08lx(%lu)\n", __func__, start,
130 - return IS_ERR(page);
133 - offset = start & ~PAGE_MASK;
134 - kaddr = page_address(page) + offset;
135 - rest = min_t(ssize_t, PAGE_SIZE - offset, len);
137 - MEM_FlushCache(kaddr, rest, ftype);
147 /* Check if the given area blongs to process virtul memory address space */
148 -static int memory_sync_vma(unsigned long start, u32 len,
149 - enum DSP_FLUSHTYPE ftype)
150 +static int memory_check_vma(unsigned long start, u32 len)
154 @@ -610,19 +575,14 @@ static int memory_sync_vma(unsigned long
158 - while ((vma = find_vma(current->mm, start)) != NULL) {
161 - if (vma->vm_flags & (VM_IO | VM_PFNMAP))
163 + down_read(¤t->mm->mmap_sem);
165 - if (vma->vm_start > start)
167 + while ((vma = find_vma(current->mm, start)) != NULL) {
169 - size = min_t(ssize_t, vma->vm_end - start, len);
170 - err = memory_sync_page(vma, start, size, ftype);
172 + if (vma->vm_start > start) {
177 if (end <= vma->vm_end)
179 @@ -633,12 +593,13 @@ static int memory_sync_vma(unsigned long
183 + up_read(¤t->mm->mmap_sem);
188 static DSP_STATUS proc_memory_sync(void *hProcessor, void *pMpuAddr,
189 - u32 ulSize, u32 ulFlags,
190 - enum DSP_FLUSHTYPE FlushMemType)
191 + u32 ulSize, u32 ulFlags)
193 /* Keep STATUS here for future additions to this function */
194 DSP_STATUS status = DSP_SOK;
195 @@ -649,16 +610,20 @@ static DSP_STATUS proc_memory_sync(void
196 "hProcessor: 0x%x pMpuAddr: 0x%x ulSize 0x%x, ulFlags 0x%x\n",
197 __func__, hProcessor, pMpuAddr, ulSize, ulFlags);
199 - down_read(¤t->mm->mmap_sem);
201 - if (memory_sync_vma((u32)pMpuAddr, ulSize, FlushMemType)) {
202 - pr_err("%s: InValid address parameters %p %x\n",
203 - __func__, pMpuAddr, ulSize);
204 + if (memory_check_vma((u32)pMpuAddr, ulSize)) {
205 + GT_3trace(PROC_DebugMask, GT_7CLASS,
206 + "%s: InValid address parameters\n",
207 + __func__, pMpuAddr, ulSize);
208 status = DSP_EHANDLE;
213 - up_read(¤t->mm->mmap_sem);
214 + (void)SYNC_EnterCS(hProcLock);
215 + MEM_FlushCache(pMpuAddr, ulSize, ulFlags);
216 + (void)SYNC_LeaveCS(hProcLock);
219 GT_2trace(PROC_DebugMask, GT_ENTER,
220 "Leaving %s [0x%x]", __func__, status);
222 @@ -673,9 +638,7 @@ static DSP_STATUS proc_memory_sync(void
223 DSP_STATUS PROC_FlushMemory(void *hProcessor, void *pMpuAddr,
224 u32 ulSize, u32 ulFlags)
226 - enum DSP_FLUSHTYPE mtype = PROC_WRITEBACK_INVALIDATE_MEM;
228 - return proc_memory_sync(hProcessor, pMpuAddr, ulSize, ulFlags, mtype);
229 + return proc_memory_sync(hProcessor, pMpuAddr, ulSize, ulFlags);
233 @@ -686,9 +649,7 @@ DSP_STATUS PROC_FlushMemory(void *hProce
234 DSP_STATUS PROC_InvalidateMemory(void *hProcessor, void *pMpuAddr,
237 - enum DSP_FLUSHTYPE mtype = PROC_INVALIDATE_MEM;
239 - return proc_memory_sync(hProcessor, pMpuAddr, ulSize, 0, mtype);
240 + return proc_memory_sync(hProcessor, pMpuAddr, ulSize, 0);
244 diff -rupN kernel-power-2.6.28.orig/drivers/dsp/bridge/services/mem.c kernel-power-2.6.28/drivers/dsp/bridge/services/mem.c
245 --- kernel-power-2.6.28.orig/drivers/dsp/bridge/services/mem.c 2011-05-12 20:01:58.000000000 +0100
246 +++ kernel-power-2.6.28/drivers/dsp/bridge/services/mem.c 2011-05-12 21:11:37.000000000 +0100
247 @@ -420,7 +420,7 @@ void MEM_Exit(void)
251 -void MEM_FlushCache(void *pMemBuf, u32 cBytes, s32 FlushType)
252 +void MEM_FlushCache(void *pMemBuf, u32 cBytes, u32 FlushType)
256 @@ -444,6 +444,10 @@ void MEM_FlushCache(void *pMemBuf, u32 c
257 outer_flush_range(__pa((u32)pMemBuf), __pa((u32)pMemBuf +
260 + /* Writeback and Invalidate all */
261 + case PROC_WRBK_INV_ALL:
262 + __cpuc_flush_kern_all();