Port-m68k archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: NetBSD-current on Quadra 610
And here is the patch from mlestv (with bugs added by me) I talked about.
Martin
? compile/MAC-BETH
? compile/MAC-BETH_nossp
? conf/MAC-BETH
Index: dev/adb_direct.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/dev/adb_direct.c,v
retrieving revision 1.66
diff -u -p -r1.66 adb_direct.c
--- dev/adb_direct.c 25 Oct 2013 21:19:56 -0000 1.66
+++ dev/adb_direct.c 17 Aug 2014 16:35:02 -0000
@@ -385,7 +385,7 @@ adb_cuda_tickle(void)
* called when when an adb interrupt happens
*
* Cuda version of adb_intr
- * TO DO: do we want to add some calls to intr_dispatch() here to
+ * TO DO: do we want to add some calls to intr_dispatch_serial() here to
* grab serial interrupts?
*/
void
@@ -721,7 +721,7 @@ adb_intr_II(void *arg)
delay(ADB_DELAY); /* yuck (don't remove) */
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
if (ADB_INTR_IS_ON)
intr_on = 1; /* save for later */
@@ -769,7 +769,7 @@ switch_start:
adbActionState = ADB_ACTION_IN;
}
delay(ADB_DELAY);
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
goto switch_start;
break;
case ADB_ACTION_IDLE:
@@ -1263,7 +1263,7 @@ switch_start:
ADB_SET_STATE_ACKON(); /* start ACK to ADB chip */
delay(ADB_DELAY); /* delay */
ADB_SET_STATE_ACKOFF(); /* end ACK to ADB chip */
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
break;
case ADB_ACTION_IN:
@@ -1277,7 +1277,7 @@ switch_start:
ADB_SET_STATE_ACKON(); /* start ACK to ADB chip */
delay(ADB_DELAY); /* delay */
ADB_SET_STATE_ACKOFF(); /* end ACK to ADB chip */
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
if (1 == ending) { /* end of message? */
ADB_SET_STATE_INACTIVE(); /* signal end of frame
*/
@@ -1324,7 +1324,7 @@ switch_start:
adbActionState = ADB_ACTION_OUT; /* set
next state */
delay(ADB_DELAY); /* delay */
- (void)intr_dispatch(0x70); /* grab any serial
interrupts */
+ intr_dispatch_serial(); /* grab any serial
interrupts */
if (ADB_INTR_IS_ON) { /* ADB intr low during
* write */
@@ -1365,13 +1365,13 @@ switch_start:
adbWriteDelay = 1; /* must retry when done with
* read */
delay(ADB_DELAY); /* delay */
- (void)intr_dispatch(0x70); /* grab any serial
interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
goto switch_start; /* process next state right
* now */
break;
}
delay(ADB_DELAY); /* required delay */
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
if (adbOutputBuffer[0] == adbSentChars) { /* check for
done */
if (0 == adb_cmd_result(adbOutputBuffer)) { /* do
we expect data
Index: dev/pm_direct.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/dev/pm_direct.c,v
retrieving revision 1.29
diff -u -p -r1.29 pm_direct.c
--- dev/pm_direct.c 25 Oct 2013 20:49:38 -0000 1.29
+++ dev/pm_direct.c 17 Aug 2014 16:35:02 -0000
@@ -297,7 +297,7 @@ pm_wait_busy(int xdelay)
{
while (PM_IS_ON) {
#ifdef PM_GRAB_SI
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
#endif
if ((--xdelay) < 0)
return 1; /* timeout */
@@ -314,7 +314,7 @@ pm_wait_free(int xdelay)
{
while (PM_IS_OFF) {
#ifdef PM_GRAB_SI
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
#endif
if ((--xdelay) < 0)
return 0; /* timeout */
@@ -1051,7 +1051,7 @@ pm_adb_op(u_char *buffer, void *compRout
break;
}
#ifdef PM_GRAB_SI
- (void)intr_dispatch(0x70); /* grab any serial interrupts */
+ intr_dispatch_serial(); /* grab any serial interrupts */
#endif
if ((--xdelay) < 0) {
splx(s);
Index: include/autoconf.h
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/include/autoconf.h,v
retrieving revision 1.12
diff -u -p -r1.12 autoconf.h
--- include/autoconf.h 4 Mar 2007 06:00:08 -0000 1.12
+++ include/autoconf.h 17 Aug 2014 16:35:02 -0000
@@ -63,6 +63,7 @@ void setstatclockrate(int);
void disablertclock(void);
void mac68k_calibrate_delay(void);
void startrtclock(void);
+void rtclock_intr(void *);
/* macrom.c */
void mrg_init(void);
Index: include/intr.h
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/include/intr.h,v
retrieving revision 1.31
diff -u -p -r1.31 intr.h
--- include/intr.h 17 Jul 2008 16:13:33 -0000 1.31
+++ include/intr.h 17 Aug 2014 16:35:02 -0000
@@ -87,13 +87,16 @@ splraiseipl(ipl_cookie_t icookie)
#include <sys/spl.h>
/* intr.c */
+struct clockframe;
void intr_init(void);
void intr_establish(int (*)(void *), void *, int);
void intr_disestablish(int);
-void intr_dispatch(int);
+void intr_dispatch(struct clockframe*);
+void intr_dispatch_serial(void);
/* locore.s */
int spl0(void);
+void mrg_VBLQueue(void);
#endif /* _KERNEL */
#endif /* _MAC68K_INTR_H_ */
Index: mac68k/clock.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/clock.c,v
retrieving revision 1.49
diff -u -p -r1.49 clock.c
--- mac68k/clock.c 8 Feb 2011 20:20:18 -0000 1.49
+++ mac68k/clock.c 17 Aug 2014 16:35:02 -0000
@@ -103,7 +103,6 @@ __KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.
int clock_debug = 0;
#endif
-void rtclock_intr(void);
static int mac68k_gettime(todr_chip_handle_t, struct timeval *);
static int mac68k_settime(todr_chip_handle_t, struct timeval *);
static u_int via1_t2_get_timecount(struct timecounter *);
@@ -195,6 +194,17 @@ disablertclock(void)
via_reg(VIA1, vIER) = V1IF_T1;
}
+void rtclock_intr(void *arg)
+{
+ struct clockframe *frame = (struct clockframe *)arg;
+ int s;
+
+ s = splclock();
+ hardclock(frame);
+ mrg_VBLQueue();
+ splx(s);
+}
+
static u_int
via1_t2_get_timecount(struct timecounter *tc)
{
Index: mac68k/intr.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/intr.c,v
retrieving revision 1.29
diff -u -p -r1.29 intr.c
--- mac68k/intr.c 20 Dec 2010 00:25:36 -0000 1.29
+++ mac68k/intr.c 17 Aug 2014 16:35:02 -0000
@@ -206,12 +206,13 @@ intr_disestablish(int ipl)
* XXX Note: see the warning in intr_establish()
*/
void
-intr_dispatch(int evec) /* format | vector offset */
+intr_dispatch(struct clockframe *frame)
{
int ipl, vec;
+ void *arg;
idepth++;
- vec = (evec & 0xfff) >> 2;
+ vec = (frame->vo & 0xfff) >> 2;
#ifdef DIAGNOSTIC
if ((vec < ISRLOC) || (vec >= (ISRLOC + NISR)))
panic("intr_dispatch: bad vec 0x%x", vec);
@@ -221,11 +222,30 @@ intr_dispatch(int evec) /* format | vec
intrcnt[ipl]++;
curcpu()->ci_data.cpu_nintr++;
- (void)(*intr_func[ipl])(intr_arg[ipl]);
+ /*
+ * intr_func only has one argument but hardclock needs the
+ * clock frame.
+ */
+ if (ipl == mac68k_machine.via1_ipl)
+ arg = (void*)frame;
+ else
+ arg = intr_arg[ipl];
+
+ (void)(*intr_func[ipl])(arg);
idepth--;
}
/*
+ * poll serial interrupt from adb_direct or pm_direct
+ */
+void
+intr_dispatch_serial(void)
+{
+ struct clockframe F;
+ intr_dispatch(&F);
+}
+
+/*
* Default interrupt handler: do nothing.
*/
static int
Index: mac68k/locore.s
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/locore.s,v
retrieving revision 1.170
diff -u -p -r1.170 locore.s
--- mac68k/locore.s 15 Mar 2014 12:11:23 -0000 1.170
+++ mac68k/locore.s 17 Aug 2014 16:35:02 -0000
@@ -763,8 +763,8 @@ ENTRY_NOPROFILE(spurintr)
ENTRY_NOPROFILE(intrhand)
INTERRUPT_SAVEREG
- movw %sp@(22),%sp@- | push exception vector info
- clrw %sp@-
+ lea %sp@(16),%a0 | push exception frame
+ movel %a0,%sp@-
jbsr _C_LABEL(intr_dispatch) | call dispatch routine
addql #4,%sp
INTERRUPT_RESTOREREG
@@ -783,34 +783,6 @@ ENTRY_NOPROFILE(lev7intr)
addql #8,%sp | pop SSP and align word
jra _ASM_LABEL(rei)
-/*
- * We could tweak rtclock_intr and gain 12 cycles on the 020 and 030 by
- * saving the status register directly to the stack, but this would lose
- * badly on the 040. Aligning the stack takes 10 more cycles than this
- * code does, so it's a good compromise.
- */
-ENTRY_NOPROFILE(rtclock_intr)
- movl %d2,%sp@- | save %d2
- movw %sr,%d2 | save SPL
- movw _C_LABEL(ipl2psl_table)+IPL_CLOCK*2,%sr
- | raise SPL to splclock()
- movl %a6@,%a1 | unwind to frame in intr_dispatch
- lea %a1@(28),%a1 | push pointer to interrupt frame
- movl %a1,%sp@- | 28 = 16 for regs in intrhand,
- | + 4 for args to intr_dispatch
- | + 4 for return address to intrhand
- | + 4 for value of %A6
- jbsr _C_LABEL(hardclock) | call generic clock int routine
- addql #4,%sp | pop param
- jbsr _C_LABEL(mrg_VBLQueue) | give programs in the VBLqueue a chance
- addql #1,_C_LABEL(intrcnt)+32 | record a clock interrupt
- INTERRUPT_SAVEREG
- CPUINFO_INCREMENT(CI_NINTR)
- INTERRUPT_RESTOREREG
- movw %d2,%sr | restore SPL
- movl %sp@+,%d2 | restore %d2
- rts | go back from whence we came
-
/*
* Emulation of VAX REI instruction.
*
Index: mac68k/via.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/via.c,v
retrieving revision 1.75
diff -u -p -r1.75 via.c
--- mac68k/via.c 11 Dec 2005 12:18:03 -0000 1.75
+++ mac68k/via.c 17 Aug 2014 16:35:02 -0000
@@ -262,7 +262,10 @@ via1_intr(void *intr_arg)
bitnum = 0;
do {
if (intbits & mask) {
- via1itab[bitnum](via1iarg[bitnum]);
+ /* pass clockframe through to rtclock_intr,
+ * otherwise use registered arg */
+ via1itab[bitnum](bitnum == 6 ? intr_arg
+ : via1iarg[bitnum]);
/* via_reg(VIA1, vIFR) = mask; */
}
mask <<= 1;
Home |
Main Index |
Thread Index |
Old Index