Fixed OOPS caused by unregistring bq27x00_battery driver
[kernel-power] / kernel-power-2.6.28 / debian / patches / dspbridge_flushall.diff
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
4 @@ -253,6 +253,7 @@
5                 PROC_INVALIDATE_MEM = 0,
6                 PROC_WRITEBACK_MEM,
7                 PROC_WRITEBACK_INVALIDATE_MEM,
8 +               PROC_WRBK_INV_ALL
9         } ;
10  
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 {                                                        \
16   *  Ensures:
17   *      Cache is synchronized
18   */
19 -       extern void MEM_FlushCache(void *pMemBuf, u32 cBytes, s32 FlushType);
20 +       extern void MEM_FlushCache(void *pMemBuf, u32 cBytes, u32 FlushType);
21  
22  /*
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
28                 return DSP_EHANDLE;
29  
30         if (args->ARGS_PROC_FLUSHMEMORY.ulFlags >
31 -                                        PROC_WRITEBACK_INVALIDATE_MEM)
32 +                                        PROC_WRBK_INV_ALL)
33                 return DSP_EINVALIDARG;
34  
35         status = PROC_FlushMemory(args->ARGS_PROC_FLUSHMEMORY.hProcessor,
36 @@ -1216,7 +1216,7 @@ bool validate_node_handle(struct NODE_OB
37  {
38         bool retVal = false;
39         struct PROCESS_CONTEXT *pCtxt = pr_ctxt;
40 -       struct NODE_RES_OBJECT *pNode = pCtxt->pNodeList;
41 +       struct NODE_RES_OBJECT *pNode;
42  
43         if (hNode == (struct NODE_OBJECT *) DSP_HGPPNODE)
44                 retVal = true;
45 @@ -1224,6 +1224,7 @@ bool validate_node_handle(struct NODE_OB
46         if (mutex_lock_interruptible(&pCtxt->node_mutex))
47                 return DSP_EFAIL;
48  
49 +       pNode = pCtxt->pNodeList;
50         while (pNode && !retVal) {
51                 if (hNode == pNode->hNode)
52                         retVal = true;
53 @@ -1683,11 +1684,12 @@ bool validate_strm_handle(struct STRM_OB
54  {
55         bool retVal = false;
56         struct PROCESS_CONTEXT *pCtxt = pr_ctxt;
57 -       struct STRM_RES_OBJECT *pStrm = pCtxt->pSTRMList;
58 +       struct STRM_RES_OBJECT *pStrm;
59  
60         if (mutex_lock_interruptible(&pCtxt->strm_mutex))
61                 return DSP_EFAIL;
62  
63 +       pStrm = pCtxt->pSTRMList;
64         while (pStrm && !retVal) {
65                 if (hStrm == pStrm->hStream)
66                         retVal = true;
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
71                 status = DSP_EHANDLE;
72         }
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);
77                         return DSP_EFAIL;
78 +               }
79                 (*pNodeRes)->hNode = hNode;
80                 if (pCtxt->pNodeList != NULL) {
81                         pTempNodeRes = pCtxt->pNodeList;
82 @@ -208,8 +210,10 @@ DSP_STATUS DRV_InsertDMMResElement(HANDL
83                 status = DSP_EHANDLE;
84         }
85         if (DSP_SUCCEEDED(status)) {
86 -               if (mutex_lock_interruptible(&pCtxt->dmm_mutex))
87 +               if (mutex_lock_interruptible(&pCtxt->dmm_mutex)) {
88 +                       MEM_Free(*pDMMRes);
89                         return DSP_EFAIL;
90 +               }
91  
92                 if (pCtxt->pDMMList != NULL) {
93                         GT_0trace(curTrace, GT_5CLASS,
94 @@ -439,8 +443,10 @@ DSP_STATUS DRV_ProcInsertSTRMResElement(
95                 status = DSP_EHANDLE;
96         }
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);
101                         return DSP_EFAIL;
102 +               }
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
110         return status;
111  }
112  
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)
116 -{
117 -       struct page *page;
118 -       void *kaddr;
119 -       unsigned long offset;
120 -       ssize_t rest;
121 -
122 -       while (len) {
123 -               page = follow_page(vma, start, FOLL_GET);
124 -               if (!page) {
125 -                       pr_err("%s: no page for %08lx\n", __func__, start);
126 -                       return -EINVAL;
127 -               } else if (IS_ERR(page)) {
128 -                       pr_err("%s: err page for %08lx(%lu)\n", __func__, start,
129 -                              IS_ERR(page));
130 -                       return IS_ERR(page);
131 -               }
132 -
133 -               offset = start & ~PAGE_MASK;
134 -               kaddr = page_address(page) + offset;
135 -               rest = min_t(ssize_t, PAGE_SIZE - offset, len);
136 -
137 -               MEM_FlushCache(kaddr, rest, ftype);
138 -
139 -               put_page(page);
140 -               len -= rest;
141 -               start += rest;
142 -       }
143 -
144 -       return 0;
145 -}
146 -
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)
151  {
152         int err = 0;
153         unsigned long end;
154 @@ -610,19 +575,14 @@ static int memory_sync_vma(unsigned long
155         if (end <= start)
156                 return -EINVAL;
157  
158 -       while ((vma = find_vma(current->mm, start)) != NULL) {
159 -               ssize_t size;
160 -
161 -               if (vma->vm_flags & (VM_IO | VM_PFNMAP))
162 -                       return -EINVAL;
163 +       down_read(&current->mm->mmap_sem);
164  
165 -               if (vma->vm_start > start)
166 -                       return -EINVAL;
167 +       while ((vma = find_vma(current->mm, start)) != NULL) {
168  
169 -               size = min_t(ssize_t, vma->vm_end - start, len);
170 -               err = memory_sync_page(vma, start, size, ftype);
171 -               if (err)
172 +               if (vma->vm_start > start) {
173 +                       err = -EINVAL;
174                         break;
175 +               }
176  
177                 if (end <= vma->vm_end)
178                         break;
179 @@ -633,12 +593,13 @@ static int memory_sync_vma(unsigned long
180         if (!vma)
181                 err = -EINVAL;
182  
183 +       up_read(&current->mm->mmap_sem);
184 +
185         return err;
186  }
187  
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)
192  {
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);
198  
199 -       down_read(&current->mm->mmap_sem);
200 -
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;
209 +               goto err_out;
210 +
211         }
212  
213 -       up_read(&current->mm->mmap_sem);
214 +       (void)SYNC_EnterCS(hProcLock);
215 +       MEM_FlushCache(pMpuAddr, ulSize, ulFlags);
216 +       (void)SYNC_LeaveCS(hProcLock);
217  
218 +err_out:
219         GT_2trace(PROC_DebugMask, GT_ENTER,
220                   "Leaving %s [0x%x]", __func__, status);
221  
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)
225  {
226 -       enum DSP_FLUSHTYPE mtype = PROC_WRITEBACK_INVALIDATE_MEM;
227 -
228 -       return proc_memory_sync(hProcessor, pMpuAddr, ulSize, ulFlags, mtype);
229 +       return proc_memory_sync(hProcessor, pMpuAddr, ulSize, ulFlags);
230  }
231  
232  /*
233 @@ -686,9 +649,7 @@ DSP_STATUS PROC_FlushMemory(void *hProce
234  DSP_STATUS PROC_InvalidateMemory(void *hProcessor, void *pMpuAddr,
235                                  u32 ulSize)
236  {
237 -       enum DSP_FLUSHTYPE mtype = PROC_INVALIDATE_MEM;
238 -
239 -       return proc_memory_sync(hProcessor, pMpuAddr, ulSize, 0, mtype);
240 +       return proc_memory_sync(hProcessor, pMpuAddr, ulSize, 0);
241  }
242  
243  /*
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)
248   *  Purpose:
249   *      Flush cache
250   */
251 -void MEM_FlushCache(void *pMemBuf, u32 cBytes, s32 FlushType)
252 +void MEM_FlushCache(void *pMemBuf, u32 cBytes, u32 FlushType)
253  {
254         if (!pMemBuf)
255                 return;
256 @@ -444,6 +444,10 @@ void MEM_FlushCache(void *pMemBuf, u32 c
257                 outer_flush_range(__pa((u32)pMemBuf), __pa((u32)pMemBuf +
258                                   cBytes));
259         break;
260 +       /* Writeback and Invalidate all */
261 +       case PROC_WRBK_INV_ALL:
262 +               __cpuc_flush_kern_all();
263 +               break;
264         }
265  
266  }