forked from Minki/linux
ALSA: fix emu8000 DRAM sizing for AWE64 Value
Applicable to any kernel since 2013:
The special case added in commit 1338fc97d0
did not handle the possibility
that the address space on an AWE64 Value would wrap around at 512 KiB. That
is what it does, so the memory is still not detected on those cards.
Fix that with a logic clean-up that eliminates the need for a special case.
Signed-off-by: David Flater <dave@flaterco.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
ace79a3592
commit
1730fd9cce
@ -378,13 +378,12 @@ init_arrays(struct snd_emu8000 *emu)
|
||||
static void
|
||||
size_dram(struct snd_emu8000 *emu)
|
||||
{
|
||||
int i, size, detected_size;
|
||||
int i, size;
|
||||
|
||||
if (emu->dram_checked)
|
||||
return;
|
||||
|
||||
size = 0;
|
||||
detected_size = 0;
|
||||
|
||||
/* write out a magic number */
|
||||
snd_emu8000_dma_chan(emu, 0, EMU8000_RAM_WRITE);
|
||||
@ -392,10 +391,19 @@ size_dram(struct snd_emu8000 *emu)
|
||||
EMU8000_SMALW_WRITE(emu, EMU8000_DRAM_OFFSET);
|
||||
EMU8000_SMLD_WRITE(emu, UNIQUE_ID1);
|
||||
snd_emu8000_init_fm(emu); /* This must really be here and not 2 lines back even */
|
||||
snd_emu8000_write_wait(emu);
|
||||
|
||||
while (size < EMU8000_MAX_DRAM) {
|
||||
/*
|
||||
* Detect first 512 KiB. If a write succeeds at the beginning of a
|
||||
* 512 KiB page we assume that the whole page is there.
|
||||
*/
|
||||
EMU8000_SMALR_WRITE(emu, EMU8000_DRAM_OFFSET);
|
||||
EMU8000_SMLD_READ(emu); /* discard stale data */
|
||||
if (EMU8000_SMLD_READ(emu) != UNIQUE_ID1)
|
||||
goto skip_detect; /* No RAM */
|
||||
snd_emu8000_read_wait(emu);
|
||||
|
||||
size += 512 * 1024; /* increment 512kbytes */
|
||||
for (size = 512 * 1024; size < EMU8000_MAX_DRAM; size += 512 * 1024) {
|
||||
|
||||
/* Write a unique data on the test address.
|
||||
* if the address is out of range, the data is written on
|
||||
@ -431,18 +439,9 @@ size_dram(struct snd_emu8000 *emu)
|
||||
snd_emu8000_read_wait(emu);
|
||||
|
||||
/* Otherwise, it's valid memory. */
|
||||
detected_size = size + 512 * 1024;
|
||||
}
|
||||
|
||||
/* Distinguish 512 KiB from 0. */
|
||||
if (detected_size == 0) {
|
||||
snd_emu8000_read_wait(emu);
|
||||
EMU8000_SMALR_WRITE(emu, EMU8000_DRAM_OFFSET);
|
||||
EMU8000_SMLD_READ(emu); /* discard stale data */
|
||||
if (EMU8000_SMLD_READ(emu) == UNIQUE_ID1)
|
||||
detected_size = 512 * 1024;
|
||||
}
|
||||
|
||||
skip_detect:
|
||||
/* wait until FULL bit in SMAxW register is false */
|
||||
for (i = 0; i < 10000; i++) {
|
||||
if ((EMU8000_SMALW_READ(emu) & 0x80000000) == 0)
|
||||
@ -455,9 +454,9 @@ size_dram(struct snd_emu8000 *emu)
|
||||
snd_emu8000_dma_chan(emu, 1, EMU8000_RAM_CLOSE);
|
||||
|
||||
snd_printdd("EMU8000 [0x%lx]: %d Kb on-board memory detected\n",
|
||||
emu->port1, detected_size/1024);
|
||||
emu->port1, size/1024);
|
||||
|
||||
emu->mem_size = detected_size;
|
||||
emu->mem_size = size;
|
||||
emu->dram_checked = 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user