M carrera/fns.h => carrera/fns.h +2 -0
@@ 85,6 85,7 @@ long* reg(Ureg*, int);
void restfpregs(FPsave*, ulong);
void screeninit(void);
void screenputs(char*, int);
+void seteisadma(int, void(*)(void));
long syscall(Ureg*);
void syslog(char*, int);
void sysloginit(void);
@@ 141,3 142,4 @@ Block* iallocb(int);
void* ifroute(ulong);
ulong ifunroute(ulong);
void parseip(char*, char*);
+void mpegintr(void);
M carrera/io.h => carrera/io.h +1 -0
@@ 48,6 48,7 @@ enum
Eisamphys = 0x91000000,
Eisavgaphys = Eisamphys+0xA0000,
Eisamvirt = 0xE0300000, /* Second 1M page entry from Intctl */
+ Eisadmaintr = 0x40a,
Intctlphys = 0xF0000000,
Intctlvirt = 0xE0200000,
Uart1int = (1<<9),
M carrera/trap.c => carrera/trap.c +22 -1
@@ 57,6 57,7 @@ char *fpcause[] =
};
char *fpexcname(Ureg*, ulong, char*);
#define FPEXPMASK (0x3f<<12) /* Floating exception bits in fcr31 */
+void (*eisadma[8])(void); /* Eisa dma chain vectors */
char *regname[]={
@@ 284,8 285,20 @@ trap(Ureg *ur)
}
void
+seteisadma(int ch, void (*func)(void))
+{
+ if(ch < 0 || ch > 7)
+ panic("seteisadma");
+ if(eisadma[ch] != 0)
+ print("EISA dma%d: intr used twice");
+
+ eisadma[ch] = func;
+}
+
+void
intr(Ureg *ur)
{
+ int i;
static uchar devint;
ulong cause = ur->cause;
ulong isr, vec;
@@ 351,8 364,16 @@ intr(Ureg *ur)
case 7:
audiosbintr();
break;
+ case 10:
+ mpegintr();
+ break;
case 13:
- audiodmaintr();
+ isr = EISAINB(Eisadmaintr) & ~(1<<4);
+ for(i = 0; i < 8; i++) {
+ if(isr & 1)
+ eisadma[i]();
+ isr >>= 1;
+ }
break;
}
cause &= ~INTR4;
M port/devns16552.c => port/devns16552.c +1 -1
@@ 400,7 400,7 @@ ns16552kick(Uart *p)
if(p->cts && p->blocked == 0){
n = 0;
while((uartrdreg(p, Lstat) & Outready) == 0){
- if(++n > 10000){
+ if(++n > 100000){
print("stuck serial line\n");
break;
}