/* $ZEL: sis3100rem_init.c,v 1.3 2004/05/27 23:10:44 wuestner Exp $ */ /* * Copyright (c) 2001-2004 * Peter Wuestner. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions, and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #include "sis1100_sc.h" static int sis3100_dsp_present(struct sis1100_softc* sc) { u_int32_t dsp_sc; int res; res=sis3100readremreg(sc, dsp_sc, &dsp_sc, 0); if (res) { pINFO(sc, "3100: read dsp_sc: res=%d", res); return 0; } return !!(dsp_sc&sis3100_dsp_available); } int sis3100_get_timeouts(struct sis1100_softc* sc, int* berr, int* arb) { u_int32_t stat, error; int berr_timer, long_timer, berr_time, long_time; error=sis3100readremreg(sc, vme_master_sc, &stat, 0); if (error) return error; berr_timer=(stat>>14)&3; long_timer=(stat>>12)&3; berr_time=0; long_time=0; switch (berr_timer) { case 0: berr_time=1250; break; case 1: berr_time=6250; break; case 2: berr_time=12500; break; case 3: berr_time=100000; break; } switch (long_timer) { case 0: long_time= 1; break; case 1: long_time= 10; break; case 2: long_time= 50; break; case 3: long_time=100; break; } *berr=berr_time; *arb=long_time; return 0; } static void sis3100_dump_timeouts(struct sis1100_softc* sc) { int berr_time, long_time; sis3100_get_timeouts(sc, &berr_time, &long_time); pINFO(sc, "3100: berr_time=%d ns", berr_time); pINFO(sc, "3100: long_time=%d ms", long_time); } int sis3100_set_timeouts(struct sis1100_softc* sc, int berr, int arb) /* berr in terms of 10**-9 s */ /* arb in terms of 10**-3 s */ { int berr_timer, long_timer; u_int32_t bits; if (berr>12500) berr_timer=3; else if (berr>6250) berr_timer=2; else if (berr>1250) berr_timer=1; else berr_timer=0; if (arb>50) long_timer=3; else if (arb>10) long_timer=2; else if (arb>1) long_timer=1; else long_timer=0; bits=(long_timer|(berr_timer<<2))<<12; bits|=(~bits<<16)&0xf0000000; return sis3100writeremreg(sc, vme_master_sc, bits, 0); } int sis3100rem_init(struct sis1100_softc* sc) { #define MIN_FV 3 #define MAX_FV 5 u_int32_t hv, fk, fv, stat; hv=(sc->remote_ident>>8)&0xff; fk=(sc->remote_ident>>16)&0xff; fv=(sc->remote_ident>>24)&0xff; switch (sc->remote_ident&0x00ffff00) { case 0x00010100: if (fvMAX_FV) { pINFO(sc, "3100: Driver not tested with" " remote firmware versions greater than %d.", MAX_FV); } break; default: pERROR(sc, "3100: remote hw/fw type not supported"); return -1; } if (sis1100_init_sdram(sc)<0) return -1; pINFO(sc, "3100: size of SDRAM: 0x%llx (%lld MByte)", sc->ram_size, sc->ram_size>>20); sc->dsp_present=sis3100_dsp_present(sc); pINFO(sc, "3100: DSP is %spresent", sc->dsp_present?"":"not "); SEM_LOCK(sc->sem_hw); sis3100writeremreg(sc, vme_irq_sc, 0x00fe0001, 1); /* disable VME IRQs */ sis3100readremreg(sc, vme_master_sc, &stat, 1); SEM_UNLOCK(sc->sem_hw); pINFO(sc, "3100: remote stat=0x%08x", stat); if (!(stat&vme_system_controller)) { pINFO(sc, "3100: System Controller NOT enabled!"); } sis3100_set_timeouts(sc, 5000, 10); sis3100_dump_timeouts(sc); return 0; }