• Home
  • Raw
  • Download

Lines Matching full:iop

2  * I/O Processor (IOP) management
16 * The IOP chips are used in the IIfx and some Quadras (900, 950) to manage
19 * 990429 (jmt) - Initial implementation, just enough to knock the SCC IOP
22 * 990603 (jmt) - Added code to grab the correct ISM IOP interrupt for OSS
26 * 990605 (jmt) - Rearranged things a bit wrt IOP detection; iop_present is
27 * gone, IOP base addresses are now in an array and the
28 * globally-visible functions take an IOP number instead of an
33 * IOP. The trick now is figuring out the message formats.
41 * unsolicited messages from the IOP (and our replies to them
45 * 990729 (jmt) - Added passing of pt_regs structure to IOP handlers. This is
51 * IOP hasn't died.
52 * o Some of the IOP manager routines need better error checking and
58 * IOP Message Passing 101
62 * a shared memory area in the IOP RAM. Each IOP has seven "channels"; each
63 * channel is connected to a specific software driver on the IOP. For example
64 * on the SCC IOP there is one channel for each serial port. Each channel has
69 * buffer, set the state to MSG_NEW and signal the IOP by setting the IRQ flag
70 * in the IOP control to 1. The IOP will move the state to MSG_RCVD when it
76 * To receive message from the IOP the same procedure is used except the roles
77 * are reversed. That is, the IOP puts message in the channel with a state of
80 * has been placed back in the receive channel. The IOP will then reset the
84 * interrupt level; they are distinguished by a pair of bits in the IOP status
85 * register. The IOP will raise INT0 when one or more messages in the send
96 * a message is received on that IOP/channel combination. The handlers are
98 * from the IOP. The message state will be in MSG_RCVD while the handler runs;
101 * the IOP. This two-step process is provided to allow the handler to defer
142 * IOP structures for the two IOPs
144 * The SCC IOP controls both serial ports (A and B) as its two functions.
145 * The ISM IOP controls the SWIM (floppy drive) and ADB.
151 * IOP message queues
164 static __inline__ void iop_loadaddr(volatile struct mac_iop *iop, __u16 addr) in iop_loadaddr() argument
166 iop->ram_addr_lo = addr; in iop_loadaddr()
167 iop->ram_addr_hi = addr >> 8; in iop_loadaddr()
170 static __inline__ __u8 iop_readb(volatile struct mac_iop *iop, __u16 addr) in iop_readb() argument
172 iop->ram_addr_lo = addr; in iop_readb()
173 iop->ram_addr_hi = addr >> 8; in iop_readb()
174 return iop->ram_data; in iop_readb()
177 static __inline__ void iop_writeb(volatile struct mac_iop *iop, __u16 addr, __u8 data) in iop_writeb() argument
179 iop->ram_addr_lo = addr; in iop_writeb()
180 iop->ram_addr_hi = addr >> 8; in iop_writeb()
181 iop->ram_data = data; in iop_writeb()
184 static __inline__ void iop_stop(volatile struct mac_iop *iop) in iop_stop() argument
186 iop->status_ctrl = IOP_AUTOINC; in iop_stop()
189 static __inline__ void iop_start(volatile struct mac_iop *iop) in iop_start() argument
191 iop->status_ctrl = IOP_RUN | IOP_AUTOINC; in iop_start()
194 static __inline__ void iop_interrupt(volatile struct mac_iop *iop) in iop_interrupt() argument
196 iop->status_ctrl = IOP_IRQ | IOP_RUN | IOP_AUTOINC; in iop_interrupt()
199 static int iop_alive(volatile struct mac_iop *iop) in iop_alive() argument
203 retval = (iop_readb(iop, IOP_ADDR_ALIVE) == 0xFF); in iop_alive()
204 iop_writeb(iop, IOP_ADDR_ALIVE, 0); in iop_alive()
230 * the serial IOP can be placed into bypass mode _before_ we try to
270 pr_debug("SCC IOP detected at %p\n", iop_base[IOP_NUM_SCC]); in iop_init()
273 pr_debug("ISM IOP detected at %p\n", iop_base[IOP_NUM_ISM]); in iop_init()
303 "ISM IOP", (void *)IOP_NUM_ISM)) in iop_register_interrupts()
304 pr_err("Couldn't register ISM IOP interrupt\n"); in iop_register_interrupts()
306 if (request_irq(IRQ_VIA2_0, iop_ism_irq, 0, "ISM IOP", in iop_register_interrupts()
308 pr_err("Couldn't register ISM IOP interrupt\n"); in iop_register_interrupts()
311 pr_warn("IOP: oh my god, they killed the ISM IOP!\n"); in iop_register_interrupts()
313 pr_warn("IOP: the ISM IOP seems to be alive.\n"); in iop_register_interrupts()
319 * Register or unregister a listener for a specific IOP and channel
341 * notifying the IOP.
372 volatile struct mac_iop *iop = iop_base[msg->iop_num]; in iop_do_send() local
381 iop_writeb(iop, offset, msg->message[i]); in iop_do_send()
384 iop_writeb(iop, IOP_ADDR_SEND_STATE + msg->channel, IOP_MSG_NEW); in iop_do_send()
386 iop_interrupt(iop); in iop_do_send()
396 volatile struct mac_iop *iop = iop_base[iop_num]; in iop_handle_send() local
400 iop_writeb(iop, IOP_ADDR_SEND_STATE + chan, IOP_MSG_IDLE); in iop_handle_send()
407 msg->reply[i] = iop_readb(iop, offset); in iop_handle_send()
416 if (msg && iop_readb(iop, IOP_ADDR_SEND_STATE + chan) == IOP_MSG_IDLE) in iop_handle_send()
427 volatile struct mac_iop *iop = iop_base[iop_num]; in iop_handle_recv() local
440 msg->message[i] = iop_readb(iop, offset); in iop_handle_recv()
445 iop_writeb(iop, IOP_ADDR_RECV_STATE + chan, IOP_MSG_RCVD); in iop_handle_recv()
499 * Upload code to the shared RAM of an IOP.
515 * Download code from the shared RAM of an IOP.
531 * Compare the code in the shared RAM of an IOP with a copy in system memory
553 * Handle an ISM IOP interrupt
559 volatile struct mac_iop *iop = iop_base[iop_num]; in iop_ism_irq() local
561 u8 events = iop->status_ctrl & (IOP_INT0 | IOP_INT1); in iop_ism_irq()
565 iop->status_ctrl); in iop_ism_irq()
569 iop->status_ctrl = IOP_INT0 | IOP_RUN | IOP_AUTOINC; in iop_ism_irq()
571 state = iop_readb(iop, IOP_ADDR_SEND_STATE + i); in iop_ism_irq()
582 iop->status_ctrl = IOP_INT1 | IOP_RUN | IOP_AUTOINC; in iop_ism_irq()
584 state = iop_readb(iop, IOP_ADDR_RECV_STATE + i); in iop_ism_irq()
593 events = iop->status_ctrl & (IOP_INT0 | IOP_INT1); in iop_ism_irq()