|
@@ -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;
|
|
|
}
|
|
|
|