static int snd_gus_detect_memory(struct snd_gus_card * gus) { int l, idx, local; unsigned char d; snd_gf1_poke(gus, 0L, 0xaa); snd_gf1_poke(gus, 1L, 0x55); if (snd_gf1_peek(gus, 0L) != 0xaa || snd_gf1_peek(gus, 1L) != 0x55) { snd_printk(KERN_ERR "plain GF1 card at 0x%lx without onboard DRAM?\n", gus->gf1.port); return -ENOMEM; } for (idx = 1, d = 0xab; idx < 4; idx++, d++) { local = idx << 18; snd_gf1_poke(gus, local, d); snd_gf1_poke(gus, local + 1, d + 1); if (snd_gf1_peek(gus, local) != d || snd_gf1_peek(gus, local + 1) != d + 1 || snd_gf1_peek(gus, 0L) != 0xaa) break; } #if 1 gus->gf1.memory = idx << 18; #else gus->gf1.memory = 256 * 1024; #endif for (l = 0, local = gus->gf1.memory; l < 4; l++, local -= 256 * 1024) { gus->gf1.mem_alloc.banks_8[l].address = gus->gf1.mem_alloc.banks_8[l].size = 0; gus->gf1.mem_alloc.banks_16[l].address = l << 18; gus->gf1.mem_alloc.banks_16[l].size = local > 0 ? 256 * 1024 : 0; } gus->gf1.mem_alloc.banks_8[0].size = gus->gf1.memory; return 0; /* some memory were detected */ }
static int snd_gus_dram_poke(snd_gus_card_t *gus, char __user *_buffer, unsigned int address, unsigned int size) { unsigned long flags; unsigned int size1, size2; char buffer[512], *pbuffer; while (size > 0) { if (copy_from_user(buffer, _buffer, 512)) return -EFAULT; size1 = size > 512 ? 512 : size; if (gus->interwave) { spin_lock_irqsave(&gus->reg_lock, flags); snd_gf1_write8(gus, SNDRV_GF1_GB_MEMORY_CONTROL, 0x01); snd_gf1_dram_addr(gus, address); outsb(GUSP(gus, DRAM), buffer, size1); spin_unlock_irqrestore(&gus->reg_lock, flags); address += size1; } else { pbuffer = buffer; size2 = size1; while (size2--) snd_gf1_poke(gus, address++, *pbuffer++); } size -= size1; _buffer += size1; } return 0; }