Commit 541b9bad authored by Maciej S. Szmigiero's avatar Maciej S. Szmigiero Committed by Takashi Iwai

ALSA: emu10k1: add optional debug printouts with DMA addresses

When we get a IOMMU page fault for a emu10k1 device it is very hard to
discover which of chip many DMA allocations triggered it (since on a IOMMU
system the DMA address space is often very different from the CPU one).
Let's add optional debug printouts providing this information.

These debug printouts are only enabled on an explicit request via the
kernel dynamic debug mechanism.
Signed-off-by: default avatarMaciej S. Szmigiero <mail@maciej.szmigiero.name>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 70d0bc7d
...@@ -1898,6 +1898,9 @@ int snd_emu10k1_create(struct snd_card *card, ...@@ -1898,6 +1898,9 @@ int snd_emu10k1_create(struct snd_card *card,
err = -ENOMEM; err = -ENOMEM;
goto error; goto error;
} }
dev_dbg(card->dev, "page table address range is %.8lx:%.8lx\n",
(unsigned long)emu->ptb_pages.addr,
(unsigned long)(emu->ptb_pages.addr + emu->ptb_pages.bytes));
emu->page_ptr_table = vmalloc(emu->max_cache_pages * sizeof(void *)); emu->page_ptr_table = vmalloc(emu->max_cache_pages * sizeof(void *));
emu->page_addr_table = vmalloc(emu->max_cache_pages * emu->page_addr_table = vmalloc(emu->max_cache_pages *
...@@ -1912,6 +1915,11 @@ int snd_emu10k1_create(struct snd_card *card, ...@@ -1912,6 +1915,11 @@ int snd_emu10k1_create(struct snd_card *card,
err = -ENOMEM; err = -ENOMEM;
goto error; goto error;
} }
dev_dbg(card->dev, "silent page range is %.8lx:%.8lx\n",
(unsigned long)emu->silent_page.addr,
(unsigned long)(emu->silent_page.addr +
emu->silent_page.bytes));
emu->memhdr = snd_util_memhdr_new(emu->max_cache_pages * PAGE_SIZE); emu->memhdr = snd_util_memhdr_new(emu->max_cache_pages * PAGE_SIZE);
if (emu->memhdr == NULL) { if (emu->memhdr == NULL) {
err = -ENOMEM; err = -ENOMEM;
......
...@@ -34,7 +34,10 @@ ...@@ -34,7 +34,10 @@
* aligned pages in others * aligned pages in others
*/ */
#define __set_ptb_entry(emu,page,addr) \ #define __set_ptb_entry(emu,page,addr) \
(((u32 *)(emu)->ptb_pages.area)[page] = cpu_to_le32(((addr) << (emu->address_mode)) | (page))) (((__le32 *)(emu)->ptb_pages.area)[page] = \
cpu_to_le32(((addr) << (emu->address_mode)) | (page)))
#define __get_ptb_entry(emu, page) \
(le32_to_cpu(((__le32 *)(emu)->ptb_pages.area)[page]))
#define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE) #define UNIT_PAGES (PAGE_SIZE / EMUPAGESIZE)
#define MAX_ALIGN_PAGES0 (MAXPAGES0 / UNIT_PAGES) #define MAX_ALIGN_PAGES0 (MAXPAGES0 / UNIT_PAGES)
...@@ -44,8 +47,7 @@ ...@@ -44,8 +47,7 @@
/* get offset address from aligned page */ /* get offset address from aligned page */
#define aligned_page_offset(page) ((page) << PAGE_SHIFT) #define aligned_page_offset(page) ((page) << PAGE_SHIFT)
#if PAGE_SIZE == 4096 #if PAGE_SIZE == EMUPAGESIZE && !IS_ENABLED(CONFIG_DYNAMIC_DEBUG)
/* page size == EMUPAGESIZE */
/* fill PTB entrie(s) corresponding to page with addr */ /* fill PTB entrie(s) corresponding to page with addr */
#define set_ptb_entry(emu,page,addr) __set_ptb_entry(emu,page,addr) #define set_ptb_entry(emu,page,addr) __set_ptb_entry(emu,page,addr)
/* fill PTB entrie(s) corresponding to page with silence pointer */ /* fill PTB entrie(s) corresponding to page with silence pointer */
...@@ -58,6 +60,8 @@ static inline void set_ptb_entry(struct snd_emu10k1 *emu, int page, dma_addr_t a ...@@ -58,6 +60,8 @@ static inline void set_ptb_entry(struct snd_emu10k1 *emu, int page, dma_addr_t a
page *= UNIT_PAGES; page *= UNIT_PAGES;
for (i = 0; i < UNIT_PAGES; i++, page++) { for (i = 0; i < UNIT_PAGES; i++, page++) {
__set_ptb_entry(emu, page, addr); __set_ptb_entry(emu, page, addr);
dev_dbg(emu->card->dev, "mapped page %d to entry %.8x\n", page,
(unsigned int)__get_ptb_entry(emu, page));
addr += EMUPAGESIZE; addr += EMUPAGESIZE;
} }
} }
...@@ -65,9 +69,12 @@ static inline void set_silent_ptb(struct snd_emu10k1 *emu, int page) ...@@ -65,9 +69,12 @@ static inline void set_silent_ptb(struct snd_emu10k1 *emu, int page)
{ {
int i; int i;
page *= UNIT_PAGES; page *= UNIT_PAGES;
for (i = 0; i < UNIT_PAGES; i++, page++) for (i = 0; i < UNIT_PAGES; i++, page++) {
/* do not increment ptr */ /* do not increment ptr */
__set_ptb_entry(emu, page, emu->silent_page.addr); __set_ptb_entry(emu, page, emu->silent_page.addr);
dev_dbg(emu->card->dev, "mapped silent page %d to entry %.8x\n",
page, (unsigned int)__get_ptb_entry(emu, page));
}
} }
#endif /* PAGE_SIZE */ #endif /* PAGE_SIZE */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment