1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78
79 #include <MsCommon.h>
80 #include "include/drvCompiler.h"
81 #include "include/drvPorts.h"
82 #include "include/drvPCIMEM.h"
83 #include "include/drvKernel.h"
84 #include "include/drvUSB.h"
85 #include "include/drvBitops.h"
86
87 /* ================================================ PCI Memory Management Porting ====================================================== */
88
89 static __inline__ int
is_page_busy(int blocks,U32 * bitmap)90 is_page_busy (int blocks, U32 *bitmap)
91 {
92 while (blocks > 0) {
93 if (*bitmap++ != ~0UL)
94 return 1;
95 blocks -= BITS_PER_LONG;
96 }
97 return 0;
98 }
99 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
100 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
101 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
102 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
103 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
104 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
105 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
106 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
107 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
108 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
109 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
110 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
111 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
112 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
113 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
114 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
115
pci_pool_create(const char * name,struct pci_dev * pdev,size_t size,size_t align,size_t allocation)116 struct pci_pool *pci_pool_create (const char *name, struct pci_dev *pdev,
117 size_t size, size_t align, size_t allocation)
118 {
119 struct pci_pool *retval;
120
121 if (align == 0)
122 align = 1;
123 if (size == 0)
124 return 0;
125 else if (size < align)
126 size = align;
127 else if ((size % align) != 0) {
128 size += align + 1;
129 size &= ~(align - 1);
130 }
131 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
132 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
133 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
134 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
135 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
136 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
137 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
138 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
139 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
140 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
141 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
142 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
143 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
144 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
145 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
146 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
147
148 if (allocation == 0) {
149 if (PAGE_SIZE < size)
150 allocation = size;
151 else
152 allocation = PAGE_SIZE;
153 } else if (allocation < size)
154 return 0;
155
156 if (!(retval = (struct pci_pool*) kmalloc (sizeof (*retval), SLAB_KERNEL)))
157 return retval;
158 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
159 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
160 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
161 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
162 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
163 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
164 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
165 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
166 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
167 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
168 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
169 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
170 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
171 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
172 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
173 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
174
175 strncpy (retval->name, name, sizeof (retval->name) );
176 INIT_LIST_HEAD (&retval->page_list);
177 retval->dev = pdev;
178 retval->size = size;
179 retval->allocation = allocation;
180 retval->blocks_per_page = allocation / size;
181 kdbg("Created Mem info: size=%d,allocation=%d bytes, %d blocks per page", retval->size, retval->allocation, retval->blocks_per_page);
182 return retval;
183 }
184 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
185 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
186 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
187 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
188 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
189 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
190 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
191 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
192 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
193 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
194 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
195 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
196 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
197 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
198 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
199 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
200
201 static struct pci_page *
pool_alloc_page(struct pci_pool * pool,int mem_flags)202 pool_alloc_page (struct pci_pool *pool, int mem_flags)
203 {
204 struct pci_page *page;
205 int mapsize;
206
207 mapsize = pool->blocks_per_page;
208 mapsize = (mapsize + BITS_PER_LONG - 1) / BITS_PER_LONG;
209 mapsize *= sizeof (U32);
210
211 page = (struct pci_page *) kmalloc (mapsize + sizeof(struct pci_page), mem_flags);
212 INIT_LIST_HEAD(&page->page_list);
213 if (!page)
214 return 0;
215
216 page->vaddr = ncmem_alloc_page(&page->dma);
217
218 if (page->vaddr) {
219 memset (page->bitmap, ((U32)-1), mapsize); // bit set == free
220 list_add (&page->page_list, &pool->page_list);
221 } else {
222 kfree (page);
223 page = 0;
224 }
225 return page;
226 }
227 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
228 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
229 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
230 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
231 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
232 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
233 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
234 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
235 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
236 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
237 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
238 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
239 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
240 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
241 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
242 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
243
pci_pool_alloc(struct pci_pool * pool,int mem_flags,dma_addr_t * handle)244 void *pci_pool_alloc (struct pci_pool *pool, int mem_flags, dma_addr_t *handle)
245 {
246 U32 flags;
247 struct list_head *entry;
248 struct pci_page *page;
249 int map, block;
250 size_t offset;
251 void *retval;
252
253 //restart: //restrain warning message
254 spin_lock_irqsave (&pool->lock, flags);
255 list_for_each (entry, &pool->page_list) {
256 U32 i;
257 //page = list_entry (entry, struct pci_page, page_list);
258 const struct list_head *__mptr = entry;
259 page = (struct pci_page *)( (char *)__mptr - (char *)offsetof(struct pci_page,page_list));
260
261 /* only cachable accesses here ... */
262 for (map = 0, i = 0;
263 i < pool->blocks_per_page;
264 i += BITS_PER_LONG, map++) {
265 if (page->bitmap [map] == 0)
266 continue;
267 block = ffz (~ page->bitmap [map]);
268 if ((i + block) < pool->blocks_per_page) {
269 clear_bit ( block, &page->bitmap [map],U32);
270 offset = (BITS_PER_LONG * map) + block;
271 offset *= pool->size;
272 goto ready;
273 }
274 }
275 }
276
277 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
278 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
279 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
280 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
281 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
282 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
283 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
284 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
285 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
286 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
287 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
288 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
289 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
290 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
291 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
292 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
293 if (!(page = pool_alloc_page (pool, mem_flags))) {
294 /*
295 if (mem_flags == SLAB_KERNEL) {
296 DECLARE_WAITQUEUE (wait, current);
297
298 current->state = TASK_INTERRUPTIBLE;
299 add_wait_queue (&pool->waitq, &wait);
300 spin_unlock_irqrestore (&pool->lock, flags);
301
302 schedule_timeout (POOL_TIMEOUT_JIFFIES);
303
304 current->state = TASK_RUNNING;
305 remove_wait_queue (&pool->waitq, &wait);
306 goto restart;
307 }
308 */
309 retval = 0;
310 goto done;
311 }
312
313 clear_bit (0, &page->bitmap [0],U32);
314 offset = 0;
315 ready:
316
317 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
318 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
319 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
320 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
321 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
322 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
323 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
324 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
325 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
326 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
327 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
328 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
329 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
330 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
331 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
332 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
333 retval = (void*) (offset + (size_t) ( page->vaddr ));
334 *handle = offset + page->dma;
335 done:
336 spin_unlock_irqrestore (&pool->lock, flags);
337 kdbg("The allocated addr is %p, block size is %d ,bit_map[%d] is 0x%08X",retval, pool->size ,map,(U32)page->bitmap [map]);
338 return retval;
339 }
340
341 static void
pool_free_page(struct pci_pool * pool,struct pci_page * page)342 pool_free_page (struct pci_pool *pool, struct pci_page *page)
343 {
344 //dma_addr_t dma = page->dma;
345 ncmem_free_page((U32)page->vaddr);
346 list_del (&page->page_list);
347 kfree (page);
348 }
349
350
351 void
pci_pool_destroy(struct pci_pool * pool)352 pci_pool_destroy (struct pci_pool *pool)
353 {
354 U32 flags;
355 spin_lock_irqsave (&pool->lock, flags);
356 while (!list_empty (&pool->page_list)) {
357 struct pci_page *page;
358
359 //page = list_entry (pool->page_list.next,struct pci_page, page_list);
360 const struct list_head *__mptr = pool->page_list.next;
361 page = (struct pci_page *)( (char *)__mptr - (char *)offsetof(struct pci_page,page_list) );
362
363 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
364 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
365 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
366 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
367 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
368 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
369 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
370 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
371 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
372 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
373 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
374 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
375 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
376 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
377 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
378 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
379
380 if (is_page_busy (pool->blocks_per_page, page->bitmap)) {
381 printk (KERN_ERR "pci_pool_destroy %s, %p busy\n",
382 pool->name, page->vaddr);
383 /* leak the still-in-use consistent memory */
384 list_del (&page->page_list);
385 kfree (page);
386 } else
387 pool_free_page (pool, page);
388 }
389 spin_unlock_irqrestore (&pool->lock, flags);
390 kfree (pool);
391 }
392 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
393 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
394 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
395 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
396 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
397 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
398 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
399 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
400 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
401 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
402 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
403 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
404 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
405 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
406 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
407 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
408
409
410 static struct pci_page *
pool_find_page(struct pci_pool * pool,dma_addr_t dma)411 pool_find_page (struct pci_pool *pool, dma_addr_t dma)
412 {
413 U32 flags;
414 struct list_head *entry;
415 struct pci_page *page;
416
417 spin_lock_irqsave (&pool->lock, flags);
418 list_for_each (entry, &pool->page_list) {
419
420 //page = list_entry (entry, struct pci_page, page_list);
421 const struct list_head *__mptr = entry;
422 page = (struct pci_page *)( (char *)__mptr - (char *)offsetof(struct pci_page,page_list) );
423 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
424 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
425 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
426 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
427 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
428 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
429 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
430 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
431 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
432 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
433 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
434 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
435 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
436 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
437 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
438 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
439
440 if (dma < page->dma)
441 continue;
442 if (dma < (page->dma + pool->allocation))
443 goto done;
444 }
445 page = 0;
446 done:
447 spin_unlock_irqrestore (&pool->lock, flags);
448 return page;
449 }
450
451 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
452 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
453 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
454 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
455 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
456 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
457 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
458 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
459 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
460 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
461 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
462 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
463 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
464 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
465 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
466 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
467
468 BOOL
pci_pool_free(struct pci_pool * pool,void * vaddr,dma_addr_t dma)469 pci_pool_free (struct pci_pool *pool, void *vaddr, dma_addr_t dma)
470 {
471 struct pci_page *page;
472 U32 flags;
473 int map, block;
474
475 if ((page = pool_find_page (pool, dma)) == 0) {
476 printk (KERN_ERR "pci_pool_free %s, %p/%lx (bad dma)\n",
477 pool->name, vaddr,
478 (U32) dma);
479 return FALSE;
480 }
481 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
482 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
483 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
484 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
485 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
486 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
487 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
488 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
489 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
490 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
491 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
492 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
493 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
494 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
495 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
496 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
497
498 block = dma - page->dma;
499 block /= pool->size;
500 map = block / BITS_PER_LONG;
501 block %= BITS_PER_LONG;
502
503 spin_lock_irqsave (&pool->lock, flags);
504 set_bit (block, &page->bitmap [map], U32);
505 kdbg("Free Block: addr=0x%08X bitmap is 0x%08X",dma,(U32)page->bitmap [map]);
506 /*
507 if (waitqueue_active (&pool->waitq))
508 wake_up (&pool->waitq);
509 */
510 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
511 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
512 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
513 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
514 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
515 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
516 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
517 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
518 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
519 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
520 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
521 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
522 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
523 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
524 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
525 /*USB HOST USB HOST USB HOST USB HOST USB HOST USB HOST*/
526
527 /*
528 * Resist a temptation to do
529 * if (!is_page_busy(bpp, page->bitmap)) pool_free_page(pool, page);
530 * it is not interrupt safe. Better have empty pages hang around.
531 */
532 spin_unlock_irqrestore (&pool->lock, flags);
533 return TRUE;
534 }
535 /* ============================================== End of PCI Memory Management Porting ============================================== */
536
537