1*9552Ssam /* ps.c 4.8 82/12/05 */ 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 177296Ssam #include "../h/param.h" 187296Ssam #include "../h/systm.h" 19*9552Ssam #include "../h/ioctl.h" 207296Ssam #include "../h/pte.h" 217296Ssam #include "../h/map.h" 227296Ssam #include "../h/buf.h" 237296Ssam #include "../h/conf.h" 247296Ssam #include "../h/dir.h" 257296Ssam #include "../h/user.h" 267730Sroot #include "../h/uio.h" 277296Ssam 288477Sroot #include "../vaxuba/ubareg.h" 298477Sroot #include "../vaxuba/ubavar.h" 308477Sroot #include "../vaxuba/psreg.h" 318477Sroot 327296Ssam int psprobe(), psattach(), psintr(); 337296Ssam struct uba_device *psdinfo[NPS]; 347296Ssam u_short psstd[] = { 0 }; 357296Ssam struct uba_driver psdriver = 367296Ssam { psprobe, 0, psattach, 0, psstd, "ps", psdinfo }; 377296Ssam 387296Ssam #define PSUNIT(dev) (minor(dev)) 397296Ssam 407296Ssam #define MAXAUTOREFRESH (4) 417296Ssam #define MAXAUTOMAP (4) 427296Ssam #define MAXDBSIZE (0177777/2) 437296Ssam 447296Ssam #define PSPRI (PZERO+1) 457296Ssam 467296Ssam #define PSWAIT() {register short int i, j; i=20000; while((i-- != 0)\ 477296Ssam && (((j=psaddr->ps_iostat)&DIOREADY)==0));} 487296Ssam 497296Ssam struct ps { 507296Ssam char ps_open; 517296Ssam short int ps_uid; 527296Ssam struct { 537296Ssam enum { SINGLE_STEP_RF, AUTO_RF } state; 547296Ssam enum { RUNNING_RF, SYNCING_RF, WAITING_MAP } mode; 557296Ssam unsigned short int sraddrs[MAXAUTOREFRESH]; 567296Ssam short int nsraddrs; 577296Ssam short int srcntr; 587296Ssam char waiting; 597296Ssam char stop; 607296Ssam int icnt; 617296Ssam } ps_refresh; 627296Ssam struct { 637296Ssam enum { ON_DB, OFF_DB } state; 647296Ssam unsigned short int dbaddrs[2]; 657296Ssam unsigned short int dbsize; 667296Ssam short int rbuffer; 677296Ssam } ps_dbuffer; 687296Ssam struct { 697296Ssam enum { SINGLE_STEP_MAP, AUTO_MAP } state; 707296Ssam enum { RUNNING_MAP, WAITING_RF, WAITING_START } mode; 717296Ssam unsigned short int maddrs[MAXAUTOMAP]; 727296Ssam short int nmaddrs; 737296Ssam short int mcntr; 747296Ssam short int outputstart; 757296Ssam char waiting; 767296Ssam char stop; 777296Ssam int icnt; 787296Ssam } ps_map; 797296Ssam struct { 807296Ssam short int ticked; 817296Ssam short int missed; 827296Ssam int icnt; 837296Ssam } ps_clock; 847296Ssam struct { 857296Ssam int icnt; 867296Ssam } ps_hit; 877296Ssam int ps_strayintr; 887296Ssam int last_request; 897296Ssam int strayrequest; 907296Ssam } ps[NPS]; 917296Ssam 927296Ssam psprobe(reg) 937296Ssam caddr_t reg; 947296Ssam { 957296Ssam register int br, cvec; 967296Ssam register struct psdevice *psaddr = (struct psdevice *) reg; 977296Ssam 987296Ssam psaddr->ps_iostat = PSRESET; 997296Ssam DELAY(200); 1007296Ssam psaddr->ps_addr = RTCIE; 1017296Ssam PSWAIT(); 1027296Ssam psaddr->ps_data = 01; 1037296Ssam psaddr->ps_iostat = PSIE; 1047296Ssam psaddr->ps_addr = RTCSR; 1057296Ssam PSWAIT(); 1067296Ssam psaddr->ps_data = (SYNC|RUN); 1077296Ssam DELAY(200000); 1087296Ssam psaddr->ps_addr = RTCREQ; 1097296Ssam PSWAIT(); 1107296Ssam psaddr->ps_data = 01; 1117296Ssam psaddr->ps_iostat = 0; 1127296Ssam psaddr->ps_iostat = PSRESET; 1137418Skre return (sizeof (struct psdevice)); 1147296Ssam } 1157296Ssam 1167296Ssam /*ARGSUSED*/ 1177296Ssam psattach(ui) 1187296Ssam register struct uba_device *ui; 1197296Ssam { 1208572Sroot 1217296Ssam } 1227296Ssam 1237296Ssam psopen(dev) 1247296Ssam dev_t dev; 1257296Ssam { 1267296Ssam register struct ps *psp; 1277296Ssam register struct uba_device *ui; 1287296Ssam register int unit = PSUNIT(dev); 1297296Ssam 1308572Sroot if (unit >= NPS || (psp = &ps[minor(dev)])->ps_open || 1318572Sroot (ui = psdinfo[unit]) == 0 || ui->ui_alive == 0) 1328572Sroot return (ENXIO); 1337296Ssam psp->ps_open = 1; 1347296Ssam psp->ps_uid = u.u_uid; 1357296Ssam psp->ps_strayintr = 0; 1367296Ssam psp->ps_refresh.state = SINGLE_STEP_RF; 1377296Ssam psp->ps_refresh.waiting = 0; 1387296Ssam psp->ps_refresh.stop = 0; 1397296Ssam psp->ps_dbuffer.state = OFF_DB; 1407296Ssam psp->ps_map.state = SINGLE_STEP_MAP; 1417296Ssam psp->ps_map.waiting = 0; 1427296Ssam psp->ps_map.stop = 0; 1437296Ssam psp->ps_clock.ticked = 0; 1447296Ssam psp->ps_refresh.icnt = psp->ps_map.icnt = psp->ps_clock.icnt = 0; 1457296Ssam maptouser(ui->ui_addr); 1468572Sroot return (0); 1477296Ssam } 1487296Ssam 1497296Ssam psclose(dev) 1507296Ssam dev_t dev; 1517296Ssam { 1527296Ssam register struct psdevice *psaddr = 1537296Ssam (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr; 1547296Ssam 1557296Ssam ps[PSUNIT(dev)].ps_open = 0; 1567296Ssam psaddr->ps_iostat = 0; /* clear IENABLE */ 1577296Ssam PSWAIT(); 1587296Ssam psaddr->ps_addr = RFSR; /* set in auto refresh mode */ 1597296Ssam PSWAIT(); 1607296Ssam psaddr->ps_data = AUTOREF; 1617296Ssam unmaptouser(psaddr); 1627296Ssam } 1637296Ssam 1647296Ssam /*ARGSUSED*/ 1657730Sroot psread(dev, uio) 1667296Ssam dev_t dev; 1677730Sroot struct uio *uio; 1687296Ssam { 1697296Ssam } 1707296Ssam 1717296Ssam /*ARGSUSED*/ 1727730Sroot pswrite(dev, uio) 1737296Ssam dev_t dev; 1747730Sroot struct uio *uio; 1757296Ssam { 1767296Ssam } 1777296Ssam 1787296Ssam /*ARGSUSED*/ 1797632Ssam psioctl(dev, cmd, data, flag) 1807632Ssam register caddr_t data; 1817296Ssam { 1827296Ssam register struct uba_device *ui = psdinfo[PSUNIT(dev)]; 1837296Ssam register struct ps *psp = &ps[PSUNIT(dev)]; 1847632Ssam int *waddr = *(int **)data; 1857296Ssam int n, arg, i; 1867296Ssam 1877296Ssam switch (cmd) { 1887632Ssam 1897632Ssam case PSIOGETADDR: 1907632Ssam *(caddr_t *)data = ui->ui_addr; 1917296Ssam break; 1927632Ssam 1937632Ssam case PSIOAUTOREFRESH: 1947296Ssam n = fuword(waddr++); 1958572Sroot if (n == -1) 1968572Sroot return (EFAULT); 1978572Sroot if (n < 0 || n > MAXAUTOREFRESH) 1988572Sroot return (EINVAL); 1998572Sroot for (i = 0; i < n; i++) { 2008572Sroot if ((arg = fuword(waddr++)) == -1) 2018572Sroot return (EFAULT); 2028572Sroot psp->ps_refresh.sraddrs[i] = arg; 2037296Ssam } 2048572Sroot psp->ps_refresh.state = AUTO_RF; 2058572Sroot psp->ps_refresh.nsraddrs = n; 2068572Sroot psp->ps_refresh.srcntr = 0; 2078572Sroot psp->ps_refresh.mode = WAITING_MAP; 2087296Ssam break; 2097632Ssam 2107632Ssam case PSIOAUTOMAP: 2117296Ssam n = fuword(waddr++); 2128572Sroot if (n == -1) 2138572Sroot return (EFAULT); 2148572Sroot if (n < 0 || n > MAXAUTOMAP) 2158572Sroot return (EINVAL); 2168572Sroot for (i = 0; i < n; i++) { 2178572Sroot if ((arg = fuword(waddr++)) == -1) 2188572Sroot return (EFAULT); 2198572Sroot psp->ps_map.maddrs[i] = arg; 2207296Ssam } 2218572Sroot if ((arg = fuword(waddr++)) == -1) 2228572Sroot return (EFAULT); 2238572Sroot psp->ps_map.outputstart = arg; 2248572Sroot psp->ps_map.state = AUTO_MAP; 2258572Sroot psp->ps_map.nmaddrs = n; 2268572Sroot psp->ps_map.mcntr = 0; 2278572Sroot psp->ps_map.mode = WAITING_START; 2287296Ssam break; 2297632Ssam 2307632Ssam case PSIOSINGLEREFRESH: 2317296Ssam psp->ps_refresh.state = SINGLE_STEP_RF; 2327296Ssam break; 2337632Ssam 2347632Ssam case PSIOSINGLEMAP: 2357296Ssam psp->ps_map.state = SINGLE_STEP_MAP; 2367296Ssam break; 2377632Ssam 2387632Ssam case PSIODOUBLEBUFFER: 2398572Sroot if ((arg = fuword(waddr++)) == -1) 2408572Sroot return (EFAULT); 2418572Sroot psp->ps_dbuffer.dbaddrs[0] = arg; 2428572Sroot if ((arg = fuword(waddr++)) == -1) 2438572Sroot return (EFAULT); 2448572Sroot if (arg <= 0 || arg > MAXDBSIZE) 2458572Sroot return (EINVAL); 2468572Sroot psp->ps_dbuffer.dbsize = arg; 2478572Sroot psp->ps_dbuffer.dbaddrs[1] = 2488572Sroot psp->ps_dbuffer.dbaddrs[0]+arg; 2498572Sroot psp->ps_dbuffer.state = ON_DB; 2508572Sroot psp->ps_dbuffer.rbuffer = 0; 2517296Ssam } 2527296Ssam break; 2537632Ssam 2547632Ssam case PSIOSINGLEBUFFER: 2557296Ssam psp->ps_dbuffer.state = OFF_DB; 2567296Ssam break; 2577632Ssam 2587632Ssam case PSIOWAITREFRESH: 2598572Sroot if (psp->ps_refresh.mode != RUNNING_RF) /* not running */ 2608572Sroot return (0); /* dont wait */ 2618572Sroot /* fall into ... */ 2627632Ssam 2637632Ssam case PSSIOTOPREFRESH: 2648572Sroot if (cmd == PSSTOPREFRESH) 2657296Ssam psp->ps_refresh.stop = 1; 2667296Ssam spl5(); 2677296Ssam psp->ps_refresh.waiting = 1; 2688572Sroot while (psp->ps_refresh.waiting) 2697296Ssam sleep(&psp->ps_refresh.waiting, PSPRI); 2707296Ssam spl0(); 2717296Ssam break; 2727632Ssam 2737632Ssam case PSIOWAITMAP: 2748572Sroot if (psp->ps_map.mode != RUNNING_MAP) /* not running */ 2758572Sroot return (0); /* dont wait */ 2768572Sroot /* fall into ... */ 2777632Ssam 2787632Ssam case PSIOSTOPMAP: 2798572Sroot if (cmd == PSSTOPMAP) 2807296Ssam psp->ps_map.stop = 1; 2817296Ssam spl5(); 2827296Ssam psp->ps_map.waiting = 1; 2838572Sroot while (psp->ps_map.waiting) 2847296Ssam sleep(&psp->ps_map.waiting, PSPRI); 2857296Ssam spl0(); 2867296Ssam break; 2877632Ssam 2887296Ssam default: 2898572Sroot return (ENOTTY); 2907296Ssam break; 2917296Ssam } 2928572Sroot return (0); 2937296Ssam } 2947296Ssam 2957296Ssam #define SAVEPSADDR() {register short int i, x;x=spl6();i=psaddr->ps_addr;\ 2967296Ssam while(((i=psaddr->ps_iostat)&DIOREADY)==0);\ 2977296Ssam savepsaddr=psaddr->ps_data;splx(x);} 2987296Ssam #define RESTORPSADDR() {register int x,i;x=spl6();\ 2997296Ssam while(((i=psaddr->ps_iostat)&DIOREADY)==0);\ 3007296Ssam psaddr->ps_addr=savepsaddr;splx(x);} 3017296Ssam 3027296Ssam psclockintr(dev) 3037296Ssam dev_t dev; 3047296Ssam { 3057296Ssam register struct psdevice *psaddr = 3067296Ssam (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr; 3077296Ssam register struct ps *psp = &ps[PSUNIT(dev)]; 3087296Ssam int savepsaddr; 3097296Ssam 3108572Sroot if (!psp->ps_open) 3117296Ssam return; 3127296Ssam psp->ps_clock.icnt++; 3137296Ssam SAVEPSADDR(); 3147296Ssam #ifndef EXTERNAL_SYNC 3158572Sroot if (psp->ps_refresh.state == AUTO_RF) { 3168572Sroot if (psp->ps_refresh.mode == SYNCING_RF) { 3177296Ssam psrfnext(psp, psaddr); 3187296Ssam } else { 3197296Ssam psp->ps_clock.ticked++; 3207296Ssam psp->ps_clock.missed++; 3217296Ssam } 3227296Ssam } 3237296Ssam #endif 3247296Ssam PSWAIT(); 3257296Ssam psaddr->ps_addr = RTCREQ; 3267296Ssam PSWAIT(); 3277296Ssam psaddr->ps_data = 01; /* clear the request bits */ 3287296Ssam RESTORPSADDR(); 3297296Ssam } 3307296Ssam 3317296Ssam /*ARGSUSED*/ 3327296Ssam pssystemintr(dev) 3337296Ssam dev_t dev; 3347296Ssam { 3357296Ssam register struct psdevice *psaddr = 3367296Ssam (struct psdevice *) psdinfo[PSUNIT(dev)]->ui_addr; 3377296Ssam register struct ps *psp = &ps[PSUNIT(dev)]; 3387296Ssam short int request; 3397296Ssam register int savepsaddr, x; 3407296Ssam 3418572Sroot if (!psp->ps_open) 3427296Ssam return; 3437296Ssam SAVEPSADDR(); 3447296Ssam PSWAIT(); 3457296Ssam psaddr->ps_addr = SYSREQ; 3467296Ssam PSWAIT(); 3477296Ssam request = psaddr->ps_data; 3487296Ssam psp->last_request = request; 3497296Ssam PSWAIT(); 3507296Ssam psaddr->ps_addr = SYSREQ; 3517296Ssam PSWAIT(); 3527296Ssam psaddr->ps_data = request&(~(HALT_REQ|MOSTOP_REQ)); /* acknowledge */ 3537296Ssam 3548572Sroot if (request & (MOSTOP_REQ|HALT_REQ)) { /* Map stopped */ 3557296Ssam psp->ps_map.icnt++; 3567296Ssam psmapstop(psaddr); /* kill it dead */ 3578572Sroot if (psp->ps_map.waiting) { 3587296Ssam psp->ps_map.waiting = 0; 3597296Ssam wakeup(&psp->ps_map.waiting); 3608572Sroot if (psp->ps_map.stop) { 3617296Ssam psp->ps_map.stop = 0; 3627296Ssam goto tryrf; 3637296Ssam } 3647296Ssam } 3658572Sroot if (psp->ps_map.state == AUTO_MAP) 3668572Sroot if (!psmapnext(psp, psaddr)) { 3677296Ssam psp->ps_map.mcntr = 0; 3687296Ssam /* prepare for next round */ 3697296Ssam pssetmapbounds(psp, psaddr); 3708572Sroot if (psp->ps_refresh.mode == WAITING_MAP) { 3718572Sroot if (psp->ps_dbuffer.state == ON_DB) 3727296Ssam /* fill other db */ 3737296Ssam psdbswitch(psp, psaddr); 3747296Ssam else 3757296Ssam psp->ps_map.mode = WAITING_RF; 3767296Ssam psrfnext(psp, psaddr); /* start rf */ 3777296Ssam } else 3787296Ssam psp->ps_map.mode = WAITING_RF; 3797296Ssam } 3807296Ssam } 3817296Ssam tryrf: 3828572Sroot if (request & RFSTOP_REQ) { /* Refresh stopped */ 3837296Ssam psp->ps_refresh.icnt++; 3847296Ssam psrfstop(psaddr, psp); 3858572Sroot if (psp->ps_refresh.waiting) { 3867296Ssam psp->ps_refresh.waiting = 0; 3877296Ssam wakeup(&psp->ps_refresh.waiting); 3888572Sroot if (psp->ps_refresh.stop) { 3897296Ssam psp->ps_refresh.stop = 0; 3907296Ssam goto tryhit; 3917296Ssam } 3927296Ssam } 3938572Sroot if (psp->ps_refresh.state == AUTO_RF) 3948572Sroot if (!psrfnext(psp, psaddr)) { /* at end of refresh cycle */ 3958572Sroot if (psp->ps_map.state == AUTO_MAP && 3967296Ssam psp->ps_map.mode==WAITING_RF) { 3978572Sroot if (psp->ps_dbuffer.state == ON_DB) 3987296Ssam psdbswitch(psp, psaddr); 3997296Ssam else 4007296Ssam psmapnext(psp, psaddr); 4017296Ssam } 4027296Ssam psp->ps_refresh.srcntr = 0; 4037296Ssam #ifdef EXTERNAL_SYNC 4047296Ssam x = spl6(); 4057296Ssam #endif 4068572Sroot if (!psp->ps_clock.ticked || 4077296Ssam !psrfnext(psp, psaddr)) { 4087296Ssam psp->ps_refresh.mode = SYNCING_RF; 4097296Ssam } 4107296Ssam psp->ps_clock.ticked = 0; 4117296Ssam psp->ps_refresh.mode = SYNCING_RF; 4127296Ssam #ifdef EXTERNAL_SYNC 4137296Ssam splx(x); 4147296Ssam #endif 4157296Ssam } 4167296Ssam } 4177296Ssam tryhit: 4188572Sroot if (request & HIT_REQ) { /* Hit request */ 4197296Ssam psp->ps_hit.icnt++; 4207296Ssam } 4218572Sroot if (request == 0) 4227296Ssam psp->ps_strayintr++; 4237296Ssam RESTORPSADDR(); 4247296Ssam } 4257296Ssam 4267296Ssam psrfnext(psp, psaddr) 4277296Ssam register struct ps *psp; 4287296Ssam register struct psdevice *psaddr; 4297296Ssam { 4307296Ssam 4318572Sroot if (psp->ps_refresh.srcntr < psp->ps_refresh.nsraddrs) 4327296Ssam psrfstart(psp->ps_refresh.sraddrs[psp->ps_refresh.srcntr++], 4337296Ssam psp, psaddr); 4348572Sroot else if (psp->ps_refresh.srcntr == psp->ps_refresh.nsraddrs 4357296Ssam && psp->ps_dbuffer.state == ON_DB) { 4367296Ssam psrfstart(psp->ps_dbuffer.dbaddrs[psp->ps_dbuffer.rbuffer], 4377296Ssam psp, psaddr); 4387296Ssam psp->ps_refresh.srcntr++; /* flag for after dbuffer */ 4397296Ssam } else 4407296Ssam return(0); 4417296Ssam return(1); 4427296Ssam } 4437296Ssam 4447296Ssam psrfstart(dfaddr, psp, psaddr) 4457296Ssam short int dfaddr; 4467296Ssam register struct ps *psp; 4477296Ssam register struct psdevice *psaddr; 4487296Ssam { 4497296Ssam int dummy; 4507296Ssam 4517296Ssam PSWAIT(); 4527296Ssam psaddr->ps_addr = RFASA; 4537296Ssam PSWAIT(); 4547296Ssam psaddr->ps_data = dfaddr; 4557296Ssam PSWAIT(); 4567296Ssam dummy = psaddr->ps_data; /* just access to get to status reg */ 4577296Ssam PSWAIT(); 4587296Ssam psaddr->ps_data = RFSTART; /* may want to | this value in */ 4597296Ssam psp->ps_refresh.mode = RUNNING_RF; 4607296Ssam } 4617296Ssam 4627296Ssam psrfstop(psaddr, psp) 4637296Ssam register struct psdevice *psaddr; 4647296Ssam register struct ps *psp; 4657296Ssam { 4667296Ssam 4677296Ssam PSWAIT(); 4687296Ssam psaddr->ps_addr = RFSR; 4697296Ssam PSWAIT(); 4707296Ssam psaddr->ps_data = 0; 4717296Ssam } 4727296Ssam 4737296Ssam psdbswitch(psp, psaddr) 4747296Ssam register struct ps *psp; 4757296Ssam register struct psdevice *psaddr; 4767296Ssam { 4777296Ssam 4787296Ssam psp->ps_dbuffer.rbuffer = !psp->ps_dbuffer.rbuffer; 4797296Ssam pssetmapbounds(psp, psaddr); 4807296Ssam psmapnext(psp, psaddr); 4817296Ssam } 4827296Ssam 4837296Ssam psmapnext(psp, psaddr) 4847296Ssam register struct ps *psp; 4857296Ssam register struct psdevice *psaddr; 4867296Ssam { 4877296Ssam 4888572Sroot if (psp->ps_map.mcntr < psp->ps_map.nmaddrs) 4897296Ssam psmapstart(psp->ps_map.maddrs[psp->ps_map.mcntr++], psp, psaddr); 4907296Ssam else 4917296Ssam return(0); 4927296Ssam return(1); 4937296Ssam } 4947296Ssam 4957296Ssam pssetmapbounds(psp, psaddr) 4967296Ssam register struct ps *psp; 4977296Ssam register struct psdevice *psaddr; 4987296Ssam { 4997296Ssam unsigned short int start; 5007296Ssam 5017296Ssam PSWAIT(); 5027296Ssam psaddr->ps_addr = MAOL; 5037296Ssam PSWAIT(); 5048572Sroot if (psp->ps_dbuffer.state == ON_DB) { 5057296Ssam psaddr->ps_data = (start = psp->ps_dbuffer.dbaddrs[!psp->ps_dbuffer.rbuffer]) 5067296Ssam +psp->ps_dbuffer.dbsize-2; /* 2 for a refresh halt command */ 5077296Ssam PSWAIT(); 5087296Ssam psaddr->ps_data = start; 5097296Ssam } else { 5107296Ssam start = psaddr->ps_data; /* dummy: don't update limit */ 5117296Ssam PSWAIT(); 5127296Ssam psaddr->ps_data = psp->ps_map.outputstart; 5137296Ssam } 5147296Ssam } 5157296Ssam 5167296Ssam psmapstart(dfaddr, psp, psaddr) 5177296Ssam int dfaddr; 5187296Ssam register struct ps *psp; 5197296Ssam register struct psdevice *psaddr; 5207296Ssam { 5217296Ssam int data; 5227296Ssam 5237296Ssam PSWAIT(); 5247296Ssam psaddr->ps_addr = MAIA; 5257296Ssam PSWAIT(); 5267296Ssam psaddr->ps_data = dfaddr; 5277296Ssam PSWAIT(); 5287296Ssam psaddr->ps_data = MAO|MAI; /* may want more here */ 5297296Ssam psp->ps_map.mode = RUNNING_MAP; 5307296Ssam } 5317296Ssam 5327296Ssam psmapstop(psaddr) 5337296Ssam register struct psdevice *psaddr; 5347296Ssam { 5357296Ssam 5367296Ssam PSWAIT(); 5377296Ssam psaddr->ps_addr = MASR; 5387296Ssam PSWAIT(); 5397296Ssam psaddr->ps_data = 0; /* zero MAI bit */ 5407296Ssam PSWAIT(); 5417296Ssam psaddr->ps_addr = MAIA; 5427296Ssam PSWAIT(); 5437296Ssam psaddr->ps_data = 0; /* zero input address register */ 5447296Ssam PSWAIT(); 5457296Ssam psaddr->ps_addr = SYSREQ; 5467296Ssam PSWAIT(); 5477296Ssam psaddr->ps_data = HALT_REQ|MOSTOP_REQ; /* overkill?? */ 5487296Ssam } 5497296Ssam 5507296Ssam /*ARGSUSED*/ 5517296Ssam psdeviceintr(dev) 5527296Ssam dev_t dev; 5537296Ssam { 5547296Ssam 5557296Ssam printf("ps device intr\n"); 5567296Ssam } 5577296Ssam 5587296Ssam /*ARGSUSED*/ 5597296Ssam psdmaintr(dev) 5607296Ssam dev_t dev; 5617296Ssam { 5627296Ssam 5637296Ssam printf("ps dma intr\n"); 5647296Ssam } 5657296Ssam 5667296Ssam psreset(uban) 5677296Ssam int uban; 5687296Ssam { 5697296Ssam } 5707296Ssam 5717296Ssam psextsync(PC, PS) { 5727296Ssam register int n; 5737296Ssam register struct psdevice *psaddr; 5747296Ssam register struct ps *psp; 5757296Ssam register int savepsaddr; 5767296Ssam 5777296Ssam #ifdef EXTERNAL_SYNC 5788572Sroot for (psp = ps, n = 0; n < NPS; psp++, n++) { 5798572Sroot if (!psp->ps_open) 5807296Ssam continue; 5818572Sroot if (psp->ps_refresh.mode == SYNCING_RF) { 5827296Ssam psaddr = (struct psdevice *) psdinfo[n]->ui_addr; 5837296Ssam SAVEPSADDR(); 5847296Ssam psrfnext(psp, psaddr); 5857296Ssam RESTORPSADDR(); 5867296Ssam } else { 5877296Ssam psp->ps_clock.ticked++; 5887296Ssam psp->ps_clock.missed++; 5897296Ssam } 5907296Ssam } 5917296Ssam #endif 5927296Ssam } 5937296Ssam #endif 594