ALSA: emu10k1: Emu10k2 32 bit DMA mode
Looks like audigy emu10k2 (probably emu10k1 - sb live too) support two modes for DMA. Second mode is useful for 64 bit os with more then 2 GB of ram (fixes problems with big soundfont loading) 1) 32MB from 2 GB address space using 8192 pages (used now as default) 2) 16MB from 4 GB address space using 4096 pages Mode is set using HCFG_EXPANDED_MEM flag in HCFG register. Also format of emu10k2 page table is then different. Signed-off-by: Peter Zubaj <pzubaj@marticonet.sk> Tested-by: Takashi Iwai <tiwai@suse.de> Cc: <stable@vger.kernel.org> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:

committed by
Takashi Iwai

parent
1c94e65c66
commit
7241ea558c
@@ -282,7 +282,7 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
||||
snd_emu10k1_ptr_write(emu, TCB, 0, 0); /* taken from original driver */
|
||||
snd_emu10k1_ptr_write(emu, TCBS, 0, 4); /* taken from original driver */
|
||||
|
||||
silent_page = (emu->silent_page.addr << 1) | MAP_PTI_MASK;
|
||||
silent_page = (emu->silent_page.addr << emu->address_mode) | (emu->address_mode ? MAP_PTI_MASK1 : MAP_PTI_MASK0);
|
||||
for (ch = 0; ch < NUM_G; ch++) {
|
||||
snd_emu10k1_ptr_write(emu, MAPA, ch, silent_page);
|
||||
snd_emu10k1_ptr_write(emu, MAPB, ch, silent_page);
|
||||
@@ -348,6 +348,11 @@ static int snd_emu10k1_init(struct snd_emu10k1 *emu, int enable_ir, int resume)
|
||||
outl(reg | A_IOCFG_GPOUT0, emu->port + A_IOCFG);
|
||||
}
|
||||
|
||||
if (emu->address_mode == 0) {
|
||||
/* use 16M in 4G */
|
||||
outl(inl(emu->port + HCFG) | HCFG_EXPANDED_MEM, emu->port + HCFG);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1902,8 +1907,10 @@ int snd_emu10k1_create(struct snd_card *card,
|
||||
|
||||
is_audigy = emu->audigy = c->emu10k2_chip;
|
||||
|
||||
/* set addressing mode */
|
||||
emu->address_mode = is_audigy ? 0 : 1;
|
||||
/* set the DMA transfer mask */
|
||||
emu->dma_mask = is_audigy ? AUDIGY_DMA_MASK : EMU10K1_DMA_MASK;
|
||||
emu->dma_mask = emu->address_mode ? EMU10K1_DMA_MASK : AUDIGY_DMA_MASK;
|
||||
if (pci_set_dma_mask(pci, emu->dma_mask) < 0 ||
|
||||
pci_set_consistent_dma_mask(pci, emu->dma_mask) < 0) {
|
||||
dev_err(card->dev,
|
||||
@@ -1928,7 +1935,7 @@ int snd_emu10k1_create(struct snd_card *card,
|
||||
|
||||
emu->max_cache_pages = max_cache_bytes >> PAGE_SHIFT;
|
||||
if (snd_dma_alloc_pages(SNDRV_DMA_TYPE_DEV, snd_dma_pci_data(pci),
|
||||
32 * 1024, &emu->ptb_pages) < 0) {
|
||||
(emu->address_mode ? 32 : 16) * 1024, &emu->ptb_pages) < 0) {
|
||||
err = -ENOMEM;
|
||||
goto error;
|
||||
}
|
||||
@@ -2027,8 +2034,8 @@ int snd_emu10k1_create(struct snd_card *card,
|
||||
|
||||
/* Clear silent pages and set up pointers */
|
||||
memset(emu->silent_page.area, 0, PAGE_SIZE);
|
||||
silent_page = emu->silent_page.addr << 1;
|
||||
for (idx = 0; idx < MAXPAGES; idx++)
|
||||
silent_page = emu->silent_page.addr << emu->address_mode;
|
||||
for (idx = 0; idx < (emu->address_mode ? MAXPAGES1 : MAXPAGES0); idx++)
|
||||
((u32 *)emu->ptb_pages.area)[idx] = cpu_to_le32(silent_page | idx);
|
||||
|
||||
/* set up voice indices */
|
||||
|
Reference in New Issue
Block a user