Lines Matching refs:emu
36 #define __set_ptb_entry(emu,page,addr) \ argument
37 (((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page)))
50 #define set_ptb_entry(emu,page,addr) __set_ptb_entry(emu,page,addr) argument
52 #define set_silent_ptb(emu,page) __set_ptb_entry(emu,page,emu->silent_page.addr) argument
55 static inline void set_ptb_entry(struct snd_emu10k1 *emu, int page, dma_addr_t addr) in set_ptb_entry() argument
60 __set_ptb_entry(emu, page, addr); in set_ptb_entry()
64 static inline void set_silent_ptb(struct snd_emu10k1 *emu, int page) in set_silent_ptb() argument
70 __set_ptb_entry(emu, page, emu->silent_page.addr); in set_silent_ptb()
103 static int search_empty_map_area(struct snd_emu10k1 *emu, int npages, struct list_head **nextp) in search_empty_map_area() argument
108 struct list_head *candidate = &emu->mapped_link_head; in search_empty_map_area()
111 list_for_each (pos, &emu->mapped_link_head) { in search_empty_map_area()
128 size = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0) - page; in search_empty_map_area()
142 static int map_memblk(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk) in map_memblk() argument
147 page = search_empty_map_area(emu, blk->pages, &next); in map_memblk()
153 list_add_tail(&blk->mapped_order_link, &emu->mapped_order_link_head); in map_memblk()
157 set_ptb_entry(emu, page, emu->page_addr_table[pg]); in map_memblk()
169 static int unmap_memblk(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk) in unmap_memblk() argument
176 if ((p = blk->mapped_link.prev) != &emu->mapped_link_head) { in unmap_memblk()
181 if ((p = blk->mapped_link.next) != &emu->mapped_link_head) { in unmap_memblk()
185 end_page = (emu->address_mode ? MAX_ALIGN_PAGES1 : MAX_ALIGN_PAGES0); in unmap_memblk()
193 set_silent_ptb(emu, mpage); in unmap_memblk()
206 search_empty(struct snd_emu10k1 *emu, int size) in search_empty() argument
214 list_for_each(p, &emu->memhdr->block) { in search_empty()
220 if (page + psize > emu->max_cache_pages) in search_empty()
225 …blk = (struct snd_emu10k1_memblk *)__snd_util_memblk_new(emu->memhdr, psize << PAGE_SHIFT, p->prev… in search_empty()
237 static int is_valid_page(struct snd_emu10k1 *emu, dma_addr_t addr) in is_valid_page() argument
239 if (addr & ~emu->dma_mask) { in is_valid_page()
240 dev_err(emu->card->dev, in is_valid_page()
242 emu->dma_mask, (unsigned long)addr); in is_valid_page()
246 dev_err(emu->card->dev, "page is not aligned\n"); in is_valid_page()
258 int snd_emu10k1_memblk_map(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk) in snd_emu10k1_memblk_map() argument
266 spin_lock_irqsave(&emu->memblk_lock, flags); in snd_emu10k1_memblk_map()
270 &emu->mapped_order_link_head); in snd_emu10k1_memblk_map()
271 spin_unlock_irqrestore(&emu->memblk_lock, flags); in snd_emu10k1_memblk_map()
274 if ((err = map_memblk(emu, blk)) < 0) { in snd_emu10k1_memblk_map()
277 p = emu->mapped_order_link_head.next; in snd_emu10k1_memblk_map()
278 for (; p != &emu->mapped_order_link_head; p = nextp) { in snd_emu10k1_memblk_map()
283 size = unmap_memblk(emu, deleted); in snd_emu10k1_memblk_map()
286 err = map_memblk(emu, blk); in snd_emu10k1_memblk_map()
291 spin_unlock_irqrestore(&emu->memblk_lock, flags); in snd_emu10k1_memblk_map()
301 snd_emu10k1_alloc_pages(struct snd_emu10k1 *emu, struct snd_pcm_substream *substream) in snd_emu10k1_alloc_pages() argument
308 if (snd_BUG_ON(!emu)) in snd_emu10k1_alloc_pages()
311 runtime->dma_bytes >= (emu->address_mode ? MAXPAGES1 : MAXPAGES0) * EMUPAGESIZE)) in snd_emu10k1_alloc_pages()
313 hdr = emu->memhdr; in snd_emu10k1_alloc_pages()
318 (emu->delay_pcm_irq * 2) : 0; in snd_emu10k1_alloc_pages()
320 blk = search_empty(emu, runtime->dma_bytes + idx); in snd_emu10k1_alloc_pages()
333 addr = emu->silent_page.addr; in snd_emu10k1_alloc_pages()
336 if (! is_valid_page(emu, addr)) { in snd_emu10k1_alloc_pages()
337 dev_err(emu->card->dev, in snd_emu10k1_alloc_pages()
342 emu->page_addr_table[page] = addr; in snd_emu10k1_alloc_pages()
343 emu->page_ptr_table[page] = NULL; in snd_emu10k1_alloc_pages()
348 err = snd_emu10k1_memblk_map(emu, blk); in snd_emu10k1_alloc_pages()
362 int snd_emu10k1_free_pages(struct snd_emu10k1 *emu, struct snd_util_memblk *blk) in snd_emu10k1_free_pages() argument
364 if (snd_BUG_ON(!emu || !blk)) in snd_emu10k1_free_pages()
366 return snd_emu10k1_synth_free(emu, blk); in snd_emu10k1_free_pages()
406 snd_emu10k1_synth_free(struct snd_emu10k1 *emu, struct snd_util_memblk *memblk) in snd_emu10k1_synth_free() argument
408 struct snd_util_memhdr *hdr = emu->memhdr; in snd_emu10k1_synth_free()
413 spin_lock_irqsave(&emu->memblk_lock, flags); in snd_emu10k1_synth_free()
415 unmap_memblk(emu, blk); in snd_emu10k1_synth_free()
416 spin_unlock_irqrestore(&emu->memblk_lock, flags); in snd_emu10k1_synth_free()
417 synth_free_pages(emu, blk); in snd_emu10k1_synth_free()
450 static void __synth_free_pages(struct snd_emu10k1 *emu, int first_page, in __synth_free_pages() argument
456 free_page((unsigned long)emu->page_ptr_table[page]); in __synth_free_pages()
457 emu->page_addr_table[page] = 0; in __synth_free_pages()
458 emu->page_ptr_table[page] = NULL; in __synth_free_pages()
465 static int synth_alloc_pages(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk) in synth_alloc_pages() argument
470 get_single_page_range(emu->memhdr, blk, &first_page, &last_page); in synth_alloc_pages()
476 if (!p || (page_to_pfn(p) & ~(emu->dma_mask >> PAGE_SHIFT))) { in synth_alloc_pages()
485 __synth_free_pages(emu, first_page, page - 1); in synth_alloc_pages()
488 emu->page_addr_table[page] = page_to_phys(p); in synth_alloc_pages()
489 emu->page_ptr_table[page] = page_address(p); in synth_alloc_pages()
497 static int synth_free_pages(struct snd_emu10k1 *emu, struct snd_emu10k1_memblk *blk) in synth_free_pages() argument
501 get_single_page_range(emu->memhdr, blk, &first_page, &last_page); in synth_free_pages()
502 __synth_free_pages(emu, first_page, last_page); in synth_free_pages()
507 static inline void *offset_ptr(struct snd_emu10k1 *emu, int page, int offset) in offset_ptr() argument
510 if (snd_BUG_ON(page < 0 || page >= emu->max_cache_pages)) in offset_ptr()
512 ptr = emu->page_ptr_table[page]; in offset_ptr()
514 dev_err(emu->card->dev, in offset_ptr()
525 int snd_emu10k1_synth_bzero(struct snd_emu10k1 *emu, struct snd_util_memblk *blk, in snd_emu10k1_synth_bzero() argument
541 ptr = offset_ptr(emu, page + p->first_page, offset); in snd_emu10k1_synth_bzero()
555 int snd_emu10k1_synth_copy_from_user(struct snd_emu10k1 *emu, struct snd_util_memblk *blk, in snd_emu10k1_synth_copy_from_user() argument
571 ptr = offset_ptr(emu, page + p->first_page, offset); in snd_emu10k1_synth_copy_from_user()