1*9776Ssam /* ps.c 4.9 82/12/17 */ 27296Ssam 37296Ssam /* 47296Ssam * Evans and Sutherland Picture System 2 driver 57296Ssam */ 67296Ssam 77296Ssam /* 87296Ssam * Still to be done: 97296Ssam * WAIT_HIT 107296Ssam */ 117296Ssam 127296Ssam #include "ps.h" 137296Ssam #if NPS > 0 147296Ssam 157296Ssam #define EXTERNAL_SYNC 167296Ssam 17*9776Ssam #include "../machine/pte.h" 18*9776Ssam 197296Ssam #include "../h/param.h" 207296Ssam #include "../h/systm.h" 219552Ssam #include "../h/ioctl.h" 227296Ssam #include "../h/map.h" 237296Ssam #include "../h/buf.h" 247296Ssam #include "../h/conf.h" 257296Ssam #include "../h/dir.h" 267296Ssam #include "../h/user.h" 277730Sroot #include "../h/uio.h" 287296Ssam 298477Sroot #include "../vaxuba/ubareg.h" 308477Sroot #include "../vaxuba/ubavar.h" 318477Sroot #include "../vaxuba/psreg.h" 328477Sroot 337296Ssam int psprobe(), psattach(), psintr(); 347296Ssam struct uba_device *psdinfo[NPS]; 357296Ssam u_short psstd[] = { 0 }; 367296Ssam struct uba_driver psdriver = 377296Ssam { psprobe, 0, psattach, 0, psstd, "ps", psdinfo }; 387296Ssam 397296Ssam #define PSUNIT(dev) (minor(dev)) 407296Ssam 417296Ssam #define MAXAUTOREFRESH (4) 427296Ssam #define MAXAUTOMAP (4) 437296Ssam #define MAXDBSIZE (0177777/2) 447296Ssam 457296Ssam #define PSPRI (PZERO+1) 467296Ssam 477296Ssam #define PSWAIT() {register short int i, j; i=20000; while((i-- != 0)\ 487296Ssam && (((j=psaddr->ps_iostat)&DIOREADY)==0));} 497296Ssam 507296Ssam struct ps { 517296Ssam char ps_open; 527296Ssam short int ps_uid; 537296Ssam struct { 547296Ssam enum { SINGLE_STEP_RF, AUTO_RF } state; 557296Ssam enum { RUNNING_RF, SYNCING_RF, WAITING_MAP } mode; 567296Ssam unsigned short int sraddrs[MAXAUTOREFRESH]; 577296Ssam short int nsraddrs; 587296Ssam short int srcntr; 597296Ssam char waiting; 607296Ssam char stop; 617296Ssam int icnt; 627296Ssam } ps_refresh; 637296Ssam struct { 647296Ssam enum { ON_DB, OFF_DB } state; 657296Ssam unsigned short int dbaddrs[2]; 667296Ssam unsigned short int dbsize; 677296Ssam short int rbuffer; 687296Ssam } ps_dbuffer; 697296Ssam struct { 707296Ssam enum { SINGLE_STEP_MAP, AUTO_MAP } state; 717296Ssam enum { RUNNING_MAP, WAITING_RF, WAITING_START } mode; 727296Ssam unsigned short int maddrs[MAXAUTOMAP]; 737296Ssam short int nmaddrs; 747296Ssam short int mcntr; 757296Ssam short int outputstart; 767296Ssam char waiting; 777296Ssam char stop; 787296Ssam int icnt; 797296Ssam } ps_map; 807296Ssam struct { 817296Ssam short int ticked; 827296Ssam short int missed; 837296Ssam int icnt; 847296Ssam } ps_clock; 857296Ssam struct { 867296Ssam int icnt; 877296Ssam } ps_hit; 887296Ssam int ps_strayintr; 897296Ssam int last_request; 907296Ssam int strayrequest; 917296Ssam } ps[NPS]; 927296Ssam 937296Ssam psprobe(reg) 947296Ssam caddr_t reg; 957296Ssam { 967296Ssam register int br, cvec; 977296Ssam register struct psdevice *psaddr = (struct psdevice *) reg; 987296Ssam 997296Ssam psaddr->ps_iostat = PSRESET; 1007296Ssam DELAY(200); 1017296Ssam psaddr->ps_addr = RTCIE; 1027296Ssam PSWAIT(); 1037296Ssam psaddr->ps_data = 01; 1047296Ssam psaddr->ps_iostat = PSIE; 1057296Ssam psaddr->ps_addr = RTCSR; 1067296Ssam PSWAIT(); 1077296Ssam psaddr->ps_data = (SYNC|RUN); 1087296Ssam DELAY(200000); 1097296Ssam psaddr->ps_addr = RTCREQ; 1107296Ssam PSWAIT(); 1117296Ssam psaddr->ps_data = 01; 1127296Ssam psaddr->ps_iostat = 0; 1137296Ssam psaddr->ps_iostat = PSRESET; 1147418Skre return (sizeof (struct psdevice)); 1157296Ssam } 1167296Ssam 1177296Ssam /*ARGSUSED*/ 1187296Ssam psattach(ui) 1197296Ssam register struct uba_device *ui; 1207296Ssam { 1218572Sroot 1227296Ssam } 1237296Ssam 1247296Ssam psopen(dev) 1257296Ssam dev_t dev; 1267296Ssam { 1277296Ssam register struct ps *psp; 1287296Ssam register struct uba_device *ui; 1297296Ssam register int unit = PSUNIT(dev); 1307296Ssam 1318572Sroot if (unit >= NPS || (psp = &ps[minor(dev)])->ps_open || 1328572Sroot (ui = psdinfo[unit]) == 0 || ui->ui_alive == 0) 1338572Sroot return (ENXIO); 1347296Ssam psp->ps_open = 1; 1357296Ssam psp->ps_uid = u.u_uid; 1367296Ssam psp->ps_strayintr = 0; 1377296Ssam psp->ps_refresh.state = SINGLE_STEP_RF; 1387296Ssam psp->ps_refresh.waiting = 0; 1397296Ssam psp->ps_refresh.stop = 0; 1407296Ssam psp->ps_dbuffer.state = OFF_DB; 1417296Ssam psp->ps_map.state = SINGLE_STEP_MAP; 1427296Ssam psp->ps_map.waiting = 0; 1437296Ssam psp->ps_map.stop = 0; 1447296Ssam psp->ps_clock.ticked = 0; 1457296Ssam psp->ps_refresh.icnt = psp->ps_map.icnt = psp->ps_clock.icnt = 0; 1467296Ssam maptouser(ui->ui_addr); 1478572Sroot return (0); 1487296Ssam } 1497296Ssam 1507296Ssam psclose(dev) 1517296Ssam dev_t dev; 1527296Ssam { 1537296Ssam register struct psdevice *psaddr = 1547296Ssam (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr; 1557296Ssam 1567296Ssam ps[PSUNIT(dev)].ps_open = 0; 1577296Ssam psaddr->ps_iostat = 0; /* clear IENABLE */ 1587296Ssam PSWAIT(); 1597296Ssam psaddr->ps_addr = RFSR; /* set in auto refresh mode */ 1607296Ssam PSWAIT(); 1617296Ssam psaddr->ps_data = AUTOREF; 1627296Ssam unmaptouser(psaddr); 1637296Ssam } 1647296Ssam 1657296Ssam /*ARGSUSED*/ 1667730Sroot psread(dev, uio) 1677296Ssam dev_t dev; 1687730Sroot struct uio *uio; 1697296Ssam { 1707296Ssam } 1717296Ssam 1727296Ssam /*ARGSUSED*/ 1737730Sroot pswrite(dev, uio) 1747296Ssam dev_t dev; 1757730Sroot struct uio *uio; 1767296Ssam { 1777296Ssam } 1787296Ssam 1797296Ssam /*ARGSUSED*/ 1807632Ssam psioctl(dev, cmd, data, flag) 1817632Ssam register caddr_t data; 1827296Ssam { 1837296Ssam register struct uba_device *ui = psdinfo[PSUNIT(dev)]; 1847296Ssam register struct ps *psp = &ps[PSUNIT(dev)]; 1857632Ssam int *waddr = *(int **)data; 1867296Ssam int n, arg, i; 1877296Ssam 1887296Ssam switch (cmd) { 1897632Ssam 1907632Ssam case PSIOGETADDR: 1917632Ssam *(caddr_t *)data = ui->ui_addr; 1927296Ssam break; 1937632Ssam 1947632Ssam case PSIOAUTOREFRESH: 1957296Ssam n = fuword(waddr++); 1968572Sroot if (n == -1) 1978572Sroot return (EFAULT); 1988572Sroot if (n < 0 || n > MAXAUTOREFRESH) 1998572Sroot return (EINVAL); 2008572Sroot for (i = 0; i < n; i++) { 2018572Sroot if ((arg = fuword(waddr++)) == -1) 2028572Sroot return (EFAULT); 2038572Sroot psp->ps_refresh.sraddrs[i] = arg; 2047296Ssam } 2058572Sroot psp->ps_refresh.state = AUTO_RF; 2068572Sroot psp->ps_refresh.nsraddrs = n; 2078572Sroot psp->ps_refresh.srcntr = 0; 2088572Sroot psp->ps_refresh.mode = WAITING_MAP; 2097296Ssam break; 2107632Ssam 2117632Ssam case PSIOAUTOMAP: 2127296Ssam n = fuword(waddr++); 2138572Sroot if (n == -1) 2148572Sroot return (EFAULT); 2158572Sroot if (n < 0 || n > MAXAUTOMAP) 2168572Sroot return (EINVAL); 2178572Sroot for (i = 0; i < n; i++) { 2188572Sroot if ((arg = fuword(waddr++)) == -1) 2198572Sroot return (EFAULT); 2208572Sroot psp->ps_map.maddrs[i] = arg; 2217296Ssam } 2228572Sroot if ((arg = fuword(waddr++)) == -1) 2238572Sroot return (EFAULT); 2248572Sroot psp->ps_map.outputstart = arg; 2258572Sroot psp->ps_map.state = AUTO_MAP; 2268572Sroot psp->ps_map.nmaddrs = n; 2278572Sroot psp->ps_map.mcntr = 0; 2288572Sroot psp->ps_map.mode = WAITING_START; 2297296Ssam break; 2307632Ssam 2317632Ssam case PSIOSINGLEREFRESH: 2327296Ssam psp->ps_refresh.state = SINGLE_STEP_RF; 2337296Ssam break; 2347632Ssam 2357632Ssam case PSIOSINGLEMAP: 2367296Ssam psp->ps_map.state = SINGLE_STEP_MAP; 2377296Ssam break; 2387632Ssam 2397632Ssam case PSIODOUBLEBUFFER: 2408572Sroot if ((arg = fuword(waddr++)) == -1) 2418572Sroot return (EFAULT); 2428572Sroot psp->ps_dbuffer.dbaddrs[0] = arg; 2438572Sroot if ((arg = fuword(waddr++)) == -1) 2448572Sroot return (EFAULT); 2458572Sroot if (arg <= 0 || arg > MAXDBSIZE) 2468572Sroot return (EINVAL); 2478572Sroot psp->ps_dbuffer.dbsize = arg; 2488572Sroot psp->ps_dbuffer.dbaddrs[1] = 2498572Sroot psp->ps_dbuffer.dbaddrs[0]+arg; 2508572Sroot psp->ps_dbuffer.state = ON_DB; 2518572Sroot psp->ps_dbuffer.rbuffer = 0; 2527296Ssam } 2537296Ssam break; 2547632Ssam 2557632Ssam case PSIOSINGLEBUFFER: 2567296Ssam psp->ps_dbuffer.state = OFF_DB; 2577296Ssam break; 2587632Ssam 2597632Ssam case PSIOWAITREFRESH: 2608572Sroot if (psp->ps_refresh.mode != RUNNING_RF) /* not running */ 2618572Sroot return (0); /* dont wait */ 2628572Sroot /* fall into ... */ 2637632Ssam 2647632Ssam case PSSIOTOPREFRESH: 2658572Sroot if (cmd == PSSTOPREFRESH) 2667296Ssam psp->ps_refresh.stop = 1; 2677296Ssam spl5(); 2687296Ssam psp->ps_refresh.waiting = 1; 2698572Sroot while (psp->ps_refresh.waiting) 2707296Ssam sleep(&psp->ps_refresh.waiting, PSPRI); 2717296Ssam spl0(); 2727296Ssam break; 2737632Ssam 2747632Ssam case PSIOWAITMAP: 2758572Sroot if (psp->ps_map.mode != RUNNING_MAP) /* not running */ 2768572Sroot return (0); /* dont wait */ 2778572Sroot /* fall into ... */ 2787632Ssam 2797632Ssam case PSIOSTOPMAP: 2808572Sroot if (cmd == PSSTOPMAP) 2817296Ssam psp->ps_map.stop = 1; 2827296Ssam spl5(); 2837296Ssam psp->ps_map.waiting = 1; 2848572Sroot while (psp->ps_map.waiting) 2857296Ssam sleep(&psp->ps_map.waiting, PSPRI); 2867296Ssam spl0(); 2877296Ssam break; 2887632Ssam 2897296Ssam default: 2908572Sroot return (ENOTTY); 2917296Ssam break; 2927296Ssam } 2938572Sroot return (0); 2947296Ssam } 2957296Ssam 2967296Ssam #define SAVEPSADDR() {register short int i, x;x=spl6();i=psaddr->ps_addr;\ 2977296Ssam while(((i=psaddr->ps_iostat)&DIOREADY)==0);\ 2987296Ssam savepsaddr=psaddr->ps_data;splx(x);} 2997296Ssam #define RESTORPSADDR() {register int x,i;x=spl6();\ 3007296Ssam while(((i=psaddr->ps_iostat)&DIOREADY)==0);\ 3017296Ssam psaddr->ps_addr=savepsaddr;splx(x);} 3027296Ssam 3037296Ssam psclockintr(dev) 3047296Ssam dev_t dev; 3057296Ssam { 3067296Ssam register struct psdevice *psaddr = 3077296Ssam (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr; 3087296Ssam register struct ps *psp = &ps[PSUNIT(dev)]; 3097296Ssam int savepsaddr; 3107296Ssam 3118572Sroot if (!psp->ps_open) 3127296Ssam return; 3137296Ssam psp->ps_clock.icnt++; 3147296Ssam SAVEPSADDR(); 3157296Ssam #ifndef EXTERNAL_SYNC 3168572Sroot if (psp->ps_refresh.state == AUTO_RF) { 3178572Sroot if (psp->ps_refresh.mode == SYNCING_RF) { 3187296Ssam psrfnext(psp, psaddr); 3197296Ssam } else { 3207296Ssam psp->ps_clock.ticked++; 3217296Ssam psp->ps_clock.missed++; 3227296Ssam } 3237296Ssam } 3247296Ssam #endif 3257296Ssam PSWAIT(); 3267296Ssam psaddr->ps_addr = RTCREQ; 3277296Ssam PSWAIT(); 3287296Ssam psaddr->ps_data = 01; /* clear the request bits */ 3297296Ssam RESTORPSADDR(); 3307296Ssam } 3317296Ssam 3327296Ssam /*ARGSUSED*/ 3337296Ssam pssystemintr(dev) 3347296Ssam dev_t dev; 3357296Ssam { 3367296Ssam register struct psdevice *psaddr = 3377296Ssam (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr; 3387296Ssam register struct ps *psp = &ps[PSUNIT(dev)]; 3397296Ssam short int request; 3407296Ssam register int savepsaddr, x; 3417296Ssam 3428572Sroot if (!psp->ps_open) 3437296Ssam return; 3447296Ssam SAVEPSADDR(); 3457296Ssam PSWAIT(); 3467296Ssam psaddr->ps_addr = SYSREQ; 3477296Ssam PSWAIT(); 3487296Ssam request = psaddr->ps_data; 3497296Ssam psp->last_request = request; 3507296Ssam PSWAIT(); 3517296Ssam psaddr->ps_addr = SYSREQ; 3527296Ssam PSWAIT(); 3537296Ssam psaddr->ps_data = request&(~(HALT_REQ|MOSTOP_REQ)); /* acknowledge */ 3547296Ssam 3558572Sroot if (request & (MOSTOP_REQ|HALT_REQ)) { /* Map stopped */ 3567296Ssam psp->ps_map.icnt++; 3577296Ssam psmapstop(psaddr); /* kill it dead */ 3588572Sroot if (psp->ps_map.waiting) { 3597296Ssam psp->ps_map.waiting = 0; 3607296Ssam wakeup(&psp->ps_map.waiting); 3618572Sroot if (psp->ps_map.stop) { 3627296Ssam psp->ps_map.stop = 0; 3637296Ssam goto tryrf; 3647296Ssam } 3657296Ssam } 3668572Sroot if (psp->ps_map.state == AUTO_MAP) 3678572Sroot if (!psmapnext(psp, psaddr)) { 3687296Ssam psp->ps_map.mcntr = 0; 3697296Ssam /* prepare for next round */ 3707296Ssam pssetmapbounds(psp, psaddr); 3718572Sroot if (psp->ps_refresh.mode == WAITING_MAP) { 3728572Sroot if (psp->ps_dbuffer.state == ON_DB) 3737296Ssam /* fill other db */ 3747296Ssam psdbswitch(psp, psaddr); 3757296Ssam else 3767296Ssam psp->ps_map.mode = WAITING_RF; 3777296Ssam psrfnext(psp, psaddr); /* start rf */ 3787296Ssam } else 3797296Ssam psp->ps_map.mode = WAITING_RF; 3807296Ssam } 3817296Ssam } 3827296Ssam tryrf: 3838572Sroot if (request & RFSTOP_REQ) { /* Refresh stopped */ 3847296Ssam psp->ps_refresh.icnt++; 3857296Ssam psrfstop(psaddr, psp); 3868572Sroot if (psp->ps_refresh.waiting) { 3877296Ssam psp->ps_refresh.waiting = 0; 3887296Ssam wakeup(&psp->ps_refresh.waiting); 3898572Sroot if (psp->ps_refresh.stop) { 3907296Ssam psp->ps_refresh.stop = 0; 3917296Ssam goto tryhit; 3927296Ssam } 3937296Ssam } 3948572Sroot if (psp->ps_refresh.state == AUTO_RF) 3958572Sroot if (!psrfnext(psp, psaddr)) { /* at end of refresh cycle */ 3968572Sroot if (psp->ps_map.state == AUTO_MAP && 3977296Ssam psp->ps_map.mode==WAITING_RF) { 3988572Sroot if (psp->ps_dbuffer.state == ON_DB) 3997296Ssam psdbswitch(psp, psaddr); 4007296Ssam else 4017296Ssam psmapnext(psp, psaddr); 4027296Ssam } 4037296Ssam psp->ps_refresh.srcntr = 0; 4047296Ssam #ifdef EXTERNAL_SYNC 4057296Ssam x = spl6(); 4067296Ssam #endif 4078572Sroot if (!psp->ps_clock.ticked || 4087296Ssam !psrfnext(psp, psaddr)) { 4097296Ssam psp->ps_refresh.mode = SYNCING_RF; 4107296Ssam } 4117296Ssam psp->ps_clock.ticked = 0; 4127296Ssam psp->ps_refresh.mode = SYNCING_RF; 4137296Ssam #ifdef EXTERNAL_SYNC 4147296Ssam splx(x); 4157296Ssam #endif 4167296Ssam } 4177296Ssam } 4187296Ssam tryhit: 4198572Sroot if (request & HIT_REQ) { /* Hit request */ 4207296Ssam psp->ps_hit.icnt++; 4217296Ssam } 4228572Sroot if (request == 0) 4237296Ssam psp->ps_strayintr++; 4247296Ssam RESTORPSADDR(); 4257296Ssam } 4267296Ssam 4277296Ssam psrfnext(psp, psaddr) 4287296Ssam register struct ps *psp; 4297296Ssam register struct psdevice *psaddr; 4307296Ssam { 4317296Ssam 4328572Sroot if (psp->ps_refresh.srcntr < psp->ps_refresh.nsraddrs) 4337296Ssam psrfstart(psp->ps_refresh.sraddrs[psp->ps_refresh.srcntr++], 4347296Ssam psp, psaddr); 4358572Sroot else if (psp->ps_refresh.srcntr == psp->ps_refresh.nsraddrs 4367296Ssam && psp->ps_dbuffer.state == ON_DB) { 4377296Ssam psrfstart(psp->ps_dbuffer.dbaddrs[psp->ps_dbuffer.rbuffer], 4387296Ssam psp, psaddr); 4397296Ssam psp->ps_refresh.srcntr++; /* flag for after dbuffer */ 4407296Ssam } else 4417296Ssam return(0); 4427296Ssam return(1); 4437296Ssam } 4447296Ssam 4457296Ssam psrfstart(dfaddr, psp, psaddr) 4467296Ssam short int dfaddr; 4477296Ssam register struct ps *psp; 4487296Ssam register struct psdevice *psaddr; 4497296Ssam { 4507296Ssam int dummy; 4517296Ssam 4527296Ssam PSWAIT(); 4537296Ssam psaddr->ps_addr = RFASA; 4547296Ssam PSWAIT(); 4557296Ssam psaddr->ps_data = dfaddr; 4567296Ssam PSWAIT(); 4577296Ssam dummy = psaddr->ps_data; /* just access to get to status reg */ 4587296Ssam PSWAIT(); 4597296Ssam psaddr->ps_data = RFSTART; /* may want to | this value in */ 4607296Ssam psp->ps_refresh.mode = RUNNING_RF; 4617296Ssam } 4627296Ssam 4637296Ssam psrfstop(psaddr, psp) 4647296Ssam register struct psdevice *psaddr; 4657296Ssam register struct ps *psp; 4667296Ssam { 4677296Ssam 4687296Ssam PSWAIT(); 4697296Ssam psaddr->ps_addr = RFSR; 4707296Ssam PSWAIT(); 4717296Ssam psaddr->ps_data = 0; 4727296Ssam } 4737296Ssam 4747296Ssam psdbswitch(psp, psaddr) 4757296Ssam register struct ps *psp; 4767296Ssam register struct psdevice *psaddr; 4777296Ssam { 4787296Ssam 4797296Ssam psp->ps_dbuffer.rbuffer = !psp->ps_dbuffer.rbuffer; 4807296Ssam pssetmapbounds(psp, psaddr); 4817296Ssam psmapnext(psp, psaddr); 4827296Ssam } 4837296Ssam 4847296Ssam psmapnext(psp, psaddr) 4857296Ssam register struct ps *psp; 4867296Ssam register struct psdevice *psaddr; 4877296Ssam { 4887296Ssam 4898572Sroot if (psp->ps_map.mcntr < psp->ps_map.nmaddrs) 4907296Ssam psmapstart(psp->ps_map.maddrs[psp->ps_map.mcntr++], psp, psaddr); 4917296Ssam else 4927296Ssam return(0); 4937296Ssam return(1); 4947296Ssam } 4957296Ssam 4967296Ssam pssetmapbounds(psp, psaddr) 4977296Ssam register struct ps *psp; 4987296Ssam register struct psdevice *psaddr; 4997296Ssam { 5007296Ssam unsigned short int start; 5017296Ssam 5027296Ssam PSWAIT(); 5037296Ssam psaddr->ps_addr = MAOL; 5047296Ssam PSWAIT(); 5058572Sroot if (psp->ps_dbuffer.state == ON_DB) { 5067296Ssam psaddr->ps_data = (start = psp->ps_dbuffer.dbaddrs[!psp->ps_dbuffer.rbuffer]) 5077296Ssam +psp->ps_dbuffer.dbsize-2; /* 2 for a refresh halt command */ 5087296Ssam PSWAIT(); 5097296Ssam psaddr->ps_data = start; 5107296Ssam } else { 5117296Ssam start = psaddr->ps_data; /* dummy: don't update limit */ 5127296Ssam PSWAIT(); 5137296Ssam psaddr->ps_data = psp->ps_map.outputstart; 5147296Ssam } 5157296Ssam } 5167296Ssam 5177296Ssam psmapstart(dfaddr, psp, psaddr) 5187296Ssam int dfaddr; 5197296Ssam register struct ps *psp; 5207296Ssam register struct psdevice *psaddr; 5217296Ssam { 5227296Ssam int data; 5237296Ssam 5247296Ssam PSWAIT(); 5257296Ssam psaddr->ps_addr = MAIA; 5267296Ssam PSWAIT(); 5277296Ssam psaddr->ps_data = dfaddr; 5287296Ssam PSWAIT(); 5297296Ssam psaddr->ps_data = MAO|MAI; /* may want more here */ 5307296Ssam psp->ps_map.mode = RUNNING_MAP; 5317296Ssam } 5327296Ssam 5337296Ssam psmapstop(psaddr) 5347296Ssam register struct psdevice *psaddr; 5357296Ssam { 5367296Ssam 5377296Ssam PSWAIT(); 5387296Ssam psaddr->ps_addr = MASR; 5397296Ssam PSWAIT(); 5407296Ssam psaddr->ps_data = 0; /* zero MAI bit */ 5417296Ssam PSWAIT(); 5427296Ssam psaddr->ps_addr = MAIA; 5437296Ssam PSWAIT(); 5447296Ssam psaddr->ps_data = 0; /* zero input address register */ 5457296Ssam PSWAIT(); 5467296Ssam psaddr->ps_addr = SYSREQ; 5477296Ssam PSWAIT(); 5487296Ssam psaddr->ps_data = HALT_REQ|MOSTOP_REQ; /* overkill?? */ 5497296Ssam } 5507296Ssam 5517296Ssam /*ARGSUSED*/ 5527296Ssam psdeviceintr(dev) 5537296Ssam dev_t dev; 5547296Ssam { 5557296Ssam 5567296Ssam printf("ps device intr\n"); 5577296Ssam } 5587296Ssam 5597296Ssam /*ARGSUSED*/ 5607296Ssam psdmaintr(dev) 5617296Ssam dev_t dev; 5627296Ssam { 5637296Ssam 5647296Ssam printf("ps dma intr\n"); 5657296Ssam } 5667296Ssam 5677296Ssam psreset(uban) 5687296Ssam int uban; 5697296Ssam { 5707296Ssam } 5717296Ssam 5727296Ssam psextsync(PC, PS) { 5737296Ssam register int n; 5747296Ssam register struct psdevice *psaddr; 5757296Ssam register struct ps *psp; 5767296Ssam register int savepsaddr; 5777296Ssam 5787296Ssam #ifdef EXTERNAL_SYNC 5798572Sroot for (psp = ps, n = 0; n < NPS; psp++, n++) { 5808572Sroot if (!psp->ps_open) 5817296Ssam continue; 5828572Sroot if (psp->ps_refresh.mode == SYNCING_RF) { 5837296Ssam psaddr = (struct psdevice *) psdinfo[n]->ui_addr; 5847296Ssam SAVEPSADDR(); 5857296Ssam psrfnext(psp, psaddr); 5867296Ssam RESTORPSADDR(); 5877296Ssam } else { 5887296Ssam psp->ps_clock.ticked++; 5897296Ssam psp->ps_clock.missed++; 5907296Ssam } 5917296Ssam } 5927296Ssam #endif 5937296Ssam } 5947296Ssam #endif 595