2 * MPC85xx RapidIO support
4 * Copyright 2005 MontaVista Software, Inc.
5 * Matt Porter <mporter@kernel.crashing.org>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
13 #include <linux/init.h>
14 #include <linux/module.h>
15 #include <linux/types.h>
16 #include <linux/dma-mapping.h>
17 #include <linux/interrupt.h>
18 #include <linux/rio.h>
19 #include <linux/rio_drv.h>
23 #define RIO_REGS_BASE (CCSRBAR + 0xc0000)
24 #define RIO_ATMU_REGS_OFFSET 0x10c00
25 #define RIO_MSG_REGS_OFFSET 0x11000
26 #define RIO_MAINT_WIN_SIZE 0x400000
27 #define RIO_DBELL_WIN_SIZE 0x1000
29 #define RIO_MSG_OMR_MUI 0x00000002
30 #define RIO_MSG_OSR_TE 0x00000080
31 #define RIO_MSG_OSR_QOI 0x00000020
32 #define RIO_MSG_OSR_QFI 0x00000010
33 #define RIO_MSG_OSR_MUB 0x00000004
34 #define RIO_MSG_OSR_EOMI 0x00000002
35 #define RIO_MSG_OSR_QEI 0x00000001
37 #define RIO_MSG_IMR_MI 0x00000002
38 #define RIO_MSG_ISR_TE 0x00000080
39 #define RIO_MSG_ISR_QFI 0x00000010
40 #define RIO_MSG_ISR_DIQI 0x00000001
42 #define RIO_MSG_DESC_SIZE 32
43 #define RIO_MSG_BUFFER_SIZE 4096
44 #define RIO_MIN_TX_RING_SIZE 2
45 #define RIO_MAX_TX_RING_SIZE 2048
46 #define RIO_MIN_RX_RING_SIZE 2
47 #define RIO_MAX_RX_RING_SIZE 2048
49 #define DOORBELL_DMR_DI 0x00000002
50 #define DOORBELL_DSR_TE 0x00000080
51 #define DOORBELL_DSR_QFI 0x00000010
52 #define DOORBELL_DSR_DIQI 0x00000001
53 #define DOORBELL_TID_OFFSET 0x03
54 #define DOORBELL_SID_OFFSET 0x05
55 #define DOORBELL_INFO_OFFSET 0x06
57 #define DOORBELL_MESSAGE_SIZE 0x08
58 #define DBELL_SID(x) (*(u8 *)(x + DOORBELL_SID_OFFSET))
59 #define DBELL_TID(x) (*(u8 *)(x + DOORBELL_TID_OFFSET))
60 #define DBELL_INF(x) (*(u16 *)(x + DOORBELL_INFO_OFFSET))
62 #define is_power_of_2(x) (((x) & ((x) - 1)) == 0)
64 struct rio_atmu_regs {
118 static struct rio_atmu_regs *atmu_regs;
119 static struct rio_atmu_regs *maint_atmu_regs;
120 static struct rio_atmu_regs *dbell_atmu_regs;
121 static u32 dbell_win;
122 static u32 maint_win;
123 static struct rio_msg_regs *msg_regs;
125 static struct rio_dbell_ring {
130 static struct rio_msg_tx_ring {
133 void *virt_buffer[RIO_MAX_TX_RING_SIZE];
134 dma_addr_t phys_buffer[RIO_MAX_TX_RING_SIZE];
140 static struct rio_msg_rx_ring {
143 void *virt_buffer[RIO_MAX_RX_RING_SIZE];
150 * mpc85xx_rio_doorbell_send - Send a MPC85xx doorbell message
151 * @index: ID of RapidIO interface
152 * @destid: Destination ID of target device
153 * @data: 16-bit info field of RapidIO doorbell message
155 * Sends a MPC85xx doorbell message. Returns %0 on success or
156 * %-EINVAL on failure.
158 static int mpc85xx_rio_doorbell_send(int index, u16 destid, u16 data)
160 pr_debug("mpc85xx_doorbell_send: index %d destid %4.4x data %4.4x\n",
161 index, destid, data);
162 out_be32((void *)&dbell_atmu_regs->rowtar, destid << 22);
163 out_be16((void *)(dbell_win), data);
169 * mpc85xx_local_config_read - Generate a MPC85xx local config space read
170 * @index: ID of RapdiIO interface
171 * @offset: Offset into configuration space
172 * @len: Length (in bytes) of the maintenance transaction
173 * @data: Value to be read into
175 * Generates a MPC85xx local configuration space read. Returns %0 on
176 * success or %-EINVAL on failure.
178 static int mpc85xx_local_config_read(int index, u32 offset, int len, u32 * data)
180 pr_debug("mpc85xx_local_config_read: index %d offset %8.8x\n", index,
182 *data = in_be32((void *)(regs_win + offset));
188 * mpc85xx_local_config_write - Generate a MPC85xx local config space write
189 * @index: ID of RapdiIO interface
190 * @offset: Offset into configuration space
191 * @len: Length (in bytes) of the maintenance transaction
192 * @data: Value to be written
194 * Generates a MPC85xx local configuration space write. Returns %0 on
195 * success or %-EINVAL on failure.
197 static int mpc85xx_local_config_write(int index, u32 offset, int len, u32 data)
200 ("mpc85xx_local_config_write: index %d offset %8.8x data %8.8x\n",
201 index, offset, data);
202 out_be32((void *)(regs_win + offset), data);
208 * mpc85xx_rio_config_read - Generate a MPC85xx read maintenance transaction
209 * @index: ID of RapdiIO interface
210 * @destid: Destination ID of transaction
211 * @hopcount: Number of hops to target device
212 * @offset: Offset into configuration space
213 * @len: Length (in bytes) of the maintenance transaction
214 * @val: Location to be read into
216 * Generates a MPC85xx read maintenance transaction. Returns %0 on
217 * success or %-EINVAL on failure.
220 mpc85xx_rio_config_read(int index, u16 destid, u8 hopcount, u32 offset, int len,
226 ("mpc85xx_rio_config_read: index %d destid %d hopcount %d offset %8.8x len %d\n",
227 index, destid, hopcount, offset, len);
228 out_be32((void *)&maint_atmu_regs->rowtar,
229 (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
231 data = (u8 *) maint_win + offset;
234 *val = in_8((u8 *) data);
237 *val = in_be16((u16 *) data);
240 *val = in_be32((u32 *) data);
248 * mpc85xx_rio_config_write - Generate a MPC85xx write maintenance transaction
249 * @index: ID of RapdiIO interface
250 * @destid: Destination ID of transaction
251 * @hopcount: Number of hops to target device
252 * @offset: Offset into configuration space
253 * @len: Length (in bytes) of the maintenance transaction
254 * @val: Value to be written
256 * Generates an MPC85xx write maintenance transaction. Returns %0 on
257 * success or %-EINVAL on failure.
260 mpc85xx_rio_config_write(int index, u16 destid, u8 hopcount, u32 offset,
265 ("mpc85xx_rio_config_write: index %d destid %d hopcount %d offset %8.8x len %d val %8.8x\n",
266 index, destid, hopcount, offset, len, val);
267 out_be32((void *)&maint_atmu_regs->rowtar,
268 (destid << 22) | (hopcount << 12) | ((offset & ~0x3) >> 9));
270 data = (u8 *) maint_win + offset;
273 out_8((u8 *) data, val);
276 out_be16((u16 *) data, val);
279 out_be32((u32 *) data, val);
287 * rio_hw_add_outb_message - Add message to the MPC85xx outbound message queue
288 * @mport: Master port with outbound message queue
289 * @rdev: Target of outbound message
290 * @mbox: Outbound mailbox
291 * @buffer: Message to add to outbound queue
292 * @len: Length of message
294 * Adds the @buffer message to the MPC85xx outbound message queue. Returns
295 * %0 on success or %-EINVAL on failure.
298 rio_hw_add_outb_message(struct rio_mport *mport, struct rio_dev *rdev, int mbox,
299 void *buffer, size_t len)
302 struct rio_tx_desc *desc =
303 (struct rio_tx_desc *)msg_tx_ring.virt + msg_tx_ring.tx_slot;
307 ("RIO: rio_hw_add_outb_message(): destid %4.4x mbox %d buffer %8.8x len %8.8x\n",
308 rdev->destid, mbox, (int)buffer, len);
310 if ((len < 8) || (len > RIO_MAX_MSG_SIZE)) {
315 /* Copy and clear rest of buffer */
316 memcpy(msg_tx_ring.virt_buffer[msg_tx_ring.tx_slot], buffer, len);
317 if (len < (RIO_MAX_MSG_SIZE - 4))
318 memset((void *)((u32) msg_tx_ring.
319 virt_buffer[msg_tx_ring.tx_slot] + len), 0,
320 RIO_MAX_MSG_SIZE - len);
322 /* Set mbox field for message */
323 desc->dport = mbox & 0x3;
325 /* Enable EOMI interrupt, set priority, and set destid */
326 desc->dattr = 0x28000000 | (rdev->destid << 2);
328 /* Set transfer size aligned to next power of 2 (in double words) */
329 desc->dwcnt = is_power_of_2(len) ? len : 1 << get_bitmask_order(len);
331 /* Set snooping and source buffer address */
332 desc->saddr = 0x00000004 | msg_tx_ring.phys_buffer[msg_tx_ring.tx_slot];
334 /* Increment enqueue pointer */
335 omr = in_be32((void *)&msg_regs->omr);
336 out_be32((void *)&msg_regs->omr, omr | RIO_MSG_OMR_MUI);
338 /* Go to next descriptor */
339 if (++msg_tx_ring.tx_slot == msg_tx_ring.size)
340 msg_tx_ring.tx_slot = 0;
346 EXPORT_SYMBOL_GPL(rio_hw_add_outb_message);
349 * mpc85xx_rio_tx_handler - MPC85xx outbound message interrupt handler
350 * @irq: Linux interrupt number
351 * @dev_instance: Pointer to interrupt-specific data
353 * Handles outbound message interrupts. Executes a register outbound
354 * mailbox event handler and acks the interrupt occurence.
357 mpc85xx_rio_tx_handler(int irq, void *dev_instance)
360 struct rio_mport *port = (struct rio_mport *)dev_instance;
362 osr = in_be32((void *)&msg_regs->osr);
364 if (osr & RIO_MSG_OSR_TE) {
365 pr_info("RIO: outbound message transmission error\n");
366 out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_TE);
370 if (osr & RIO_MSG_OSR_QOI) {
371 pr_info("RIO: outbound message queue overflow\n");
372 out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_QOI);
376 if (osr & RIO_MSG_OSR_EOMI) {
377 u32 dqp = in_be32((void *)&msg_regs->odqdpar);
378 int slot = (dqp - msg_tx_ring.phys) >> 5;
379 port->outb_msg[0].mcback(port, msg_tx_ring.dev_id, -1, slot);
381 /* Ack the end-of-message interrupt */
382 out_be32((void *)&msg_regs->osr, RIO_MSG_OSR_EOMI);
390 * rio_open_outb_mbox - Initialize MPC85xx outbound mailbox
391 * @mport: Master port implementing the outbound message unit
392 * @dev_id: Device specific pointer to pass on event
393 * @mbox: Mailbox to open
394 * @entries: Number of entries in the outbound mailbox ring
396 * Initializes buffer ring, request the outbound message interrupt,
397 * and enables the outbound message unit. Returns %0 on success and
398 * %-EINVAL or %-ENOMEM on failure.
400 int rio_open_outb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
404 if ((entries < RIO_MIN_TX_RING_SIZE) ||
405 (entries > RIO_MAX_TX_RING_SIZE) || (!is_power_of_2(entries))) {
410 /* Initialize shadow copy ring */
411 msg_tx_ring.dev_id = dev_id;
412 msg_tx_ring.size = entries;
414 for (i = 0; i < msg_tx_ring.size; i++) {
416 (msg_tx_ring.virt_buffer[i] =
417 dma_alloc_coherent(NULL, RIO_MSG_BUFFER_SIZE,
418 &msg_tx_ring.phys_buffer[i],
421 for (j = 0; j < msg_tx_ring.size; j++)
422 if (msg_tx_ring.virt_buffer[j])
423 dma_free_coherent(NULL,
433 /* Initialize outbound message descriptor ring */
434 if (!(msg_tx_ring.virt = dma_alloc_coherent(NULL,
442 memset(msg_tx_ring.virt, 0, msg_tx_ring.size * RIO_MSG_DESC_SIZE);
443 msg_tx_ring.tx_slot = 0;
445 /* Point dequeue/enqueue pointers at first entry in ring */
446 out_be32((void *)&msg_regs->odqdpar, msg_tx_ring.phys);
447 out_be32((void *)&msg_regs->odqepar, msg_tx_ring.phys);
449 /* Configure for snooping */
450 out_be32((void *)&msg_regs->osar, 0x00000004);
452 /* Clear interrupt status */
453 out_be32((void *)&msg_regs->osr, 0x000000b3);
455 /* Hook up outbound message handler */
457 request_irq(MPC85xx_IRQ_RIO_TX, mpc85xx_rio_tx_handler, 0,
458 "msg_tx", (void *)mport)) < 0)
462 * Configure outbound message unit
464 * Interrupts (all enabled, except QEIE)
468 out_be32((void *)&msg_regs->omr, 0x00100220);
470 /* Set number of entries */
471 out_be32((void *)&msg_regs->omr,
472 in_be32((void *)&msg_regs->omr) |
473 ((get_bitmask_order(entries) - 2) << 12));
475 /* Now enable the unit */
476 out_be32((void *)&msg_regs->omr, in_be32((void *)&msg_regs->omr) | 0x1);
482 dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
483 msg_tx_ring.virt, msg_tx_ring.phys);
486 for (i = 0; i < msg_tx_ring.size; i++)
487 dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
488 msg_tx_ring.virt_buffer[i],
489 msg_tx_ring.phys_buffer[i]);
495 * rio_close_outb_mbox - Shut down MPC85xx outbound mailbox
496 * @mport: Master port implementing the outbound message unit
497 * @mbox: Mailbox to close
499 * Disables the outbound message unit, free all buffers, and
500 * frees the outbound message interrupt.
502 void rio_close_outb_mbox(struct rio_mport *mport, int mbox)
504 /* Disable inbound message unit */
505 out_be32((void *)&msg_regs->omr, 0);
508 dma_free_coherent(NULL, msg_tx_ring.size * RIO_MSG_DESC_SIZE,
509 msg_tx_ring.virt, msg_tx_ring.phys);
512 free_irq(MPC85xx_IRQ_RIO_TX, (void *)mport);
516 * mpc85xx_rio_rx_handler - MPC85xx inbound message interrupt handler
517 * @irq: Linux interrupt number
518 * @dev_instance: Pointer to interrupt-specific data
520 * Handles inbound message interrupts. Executes a registered inbound
521 * mailbox event handler and acks the interrupt occurence.
524 mpc85xx_rio_rx_handler(int irq, void *dev_instance)
527 struct rio_mport *port = (struct rio_mport *)dev_instance;
529 isr = in_be32((void *)&msg_regs->isr);
531 if (isr & RIO_MSG_ISR_TE) {
532 pr_info("RIO: inbound message reception error\n");
533 out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_TE);
537 /* XXX Need to check/dispatch until queue empty */
538 if (isr & RIO_MSG_ISR_DIQI) {
540 * We implement *only* mailbox 0, but can receive messages
541 * for any mailbox/letter to that mailbox destination. So,
542 * make the callback with an unknown/invalid mailbox number
545 port->inb_msg[0].mcback(port, msg_rx_ring.dev_id, -1, -1);
547 /* Ack the queueing interrupt */
548 out_be32((void *)&msg_regs->isr, RIO_MSG_ISR_DIQI);
556 * rio_open_inb_mbox - Initialize MPC85xx inbound mailbox
557 * @mport: Master port implementing the inbound message unit
558 * @dev_id: Device specific pointer to pass on event
559 * @mbox: Mailbox to open
560 * @entries: Number of entries in the inbound mailbox ring
562 * Initializes buffer ring, request the inbound message interrupt,
563 * and enables the inbound message unit. Returns %0 on success
564 * and %-EINVAL or %-ENOMEM on failure.
566 int rio_open_inb_mbox(struct rio_mport *mport, void *dev_id, int mbox, int entries)
570 if ((entries < RIO_MIN_RX_RING_SIZE) ||
571 (entries > RIO_MAX_RX_RING_SIZE) || (!is_power_of_2(entries))) {
576 /* Initialize client buffer ring */
577 msg_rx_ring.dev_id = dev_id;
578 msg_rx_ring.size = entries;
579 msg_rx_ring.rx_slot = 0;
580 for (i = 0; i < msg_rx_ring.size; i++)
581 msg_rx_ring.virt_buffer[i] = NULL;
583 /* Initialize inbound message ring */
584 if (!(msg_rx_ring.virt = dma_alloc_coherent(NULL,
593 /* Point dequeue/enqueue pointers at first entry in ring */
594 out_be32((void *)&msg_regs->ifqdpar, (u32) msg_rx_ring.phys);
595 out_be32((void *)&msg_regs->ifqepar, (u32) msg_rx_ring.phys);
597 /* Clear interrupt status */
598 out_be32((void *)&msg_regs->isr, 0x00000091);
600 /* Hook up inbound message handler */
602 request_irq(MPC85xx_IRQ_RIO_RX, mpc85xx_rio_rx_handler, 0,
603 "msg_rx", (void *)mport)) < 0) {
604 dma_free_coherent(NULL, RIO_MSG_BUFFER_SIZE,
605 msg_tx_ring.virt_buffer[i],
606 msg_tx_ring.phys_buffer[i]);
611 * Configure inbound message unit:
613 * 4KB max message size
614 * Unmask all interrupt sources
617 out_be32((void *)&msg_regs->imr, 0x001b0060);
619 /* Set number of queue entries */
620 out_be32((void *)&msg_regs->imr,
621 in_be32((void *)&msg_regs->imr) |
622 ((get_bitmask_order(entries) - 2) << 12));
624 /* Now enable the unit */
625 out_be32((void *)&msg_regs->imr, in_be32((void *)&msg_regs->imr) | 0x1);
632 * rio_close_inb_mbox - Shut down MPC85xx inbound mailbox
633 * @mport: Master port implementing the inbound message unit
634 * @mbox: Mailbox to close
636 * Disables the inbound message unit, free all buffers, and
637 * frees the inbound message interrupt.
639 void rio_close_inb_mbox(struct rio_mport *mport, int mbox)
641 /* Disable inbound message unit */
642 out_be32((void *)&msg_regs->imr, 0);
645 dma_free_coherent(NULL, msg_rx_ring.size * RIO_MAX_MSG_SIZE,
646 msg_rx_ring.virt, msg_rx_ring.phys);
649 free_irq(MPC85xx_IRQ_RIO_RX, (void *)mport);
653 * rio_hw_add_inb_buffer - Add buffer to the MPC85xx inbound message queue
654 * @mport: Master port implementing the inbound message unit
655 * @mbox: Inbound mailbox number
656 * @buf: Buffer to add to inbound queue
658 * Adds the @buf buffer to the MPC85xx inbound message queue. Returns
659 * %0 on success or %-EINVAL on failure.
661 int rio_hw_add_inb_buffer(struct rio_mport *mport, int mbox, void *buf)
665 pr_debug("RIO: rio_hw_add_inb_buffer(), msg_rx_ring.rx_slot %d\n",
666 msg_rx_ring.rx_slot);
668 if (msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot]) {
670 "RIO: error adding inbound buffer %d, buffer exists\n",
671 msg_rx_ring.rx_slot);
676 msg_rx_ring.virt_buffer[msg_rx_ring.rx_slot] = buf;
677 if (++msg_rx_ring.rx_slot == msg_rx_ring.size)
678 msg_rx_ring.rx_slot = 0;
684 EXPORT_SYMBOL_GPL(rio_hw_add_inb_buffer);
687 * rio_hw_get_inb_message - Fetch inbound message from the MPC85xx message unit
688 * @mport: Master port implementing the inbound message unit
689 * @mbox: Inbound mailbox number
691 * Gets the next available inbound message from the inbound message queue.
692 * A pointer to the message is returned on success or NULL on failure.
694 void *rio_hw_get_inb_message(struct rio_mport *mport, int mbox)
697 u32 phys_buf, virt_buf;
701 phys_buf = in_be32((void *)&msg_regs->ifqdpar);
703 /* If no more messages, then bail out */
704 if (phys_buf == in_be32((void *)&msg_regs->ifqepar))
707 virt_buf = (u32) msg_rx_ring.virt + (phys_buf - msg_rx_ring.phys);
708 buf_idx = (phys_buf - msg_rx_ring.phys) / RIO_MAX_MSG_SIZE;
709 buf = msg_rx_ring.virt_buffer[buf_idx];
713 "RIO: inbound message copy failed, no buffers\n");
717 /* Copy max message size, caller is expected to allocate that big */
718 memcpy(buf, (void *)virt_buf, RIO_MAX_MSG_SIZE);
720 /* Clear the available buffer */
721 msg_rx_ring.virt_buffer[buf_idx] = NULL;
724 imr = in_be32((void *)&msg_regs->imr);
725 out_be32((void *)&msg_regs->imr, imr | RIO_MSG_IMR_MI);
731 EXPORT_SYMBOL_GPL(rio_hw_get_inb_message);
734 * mpc85xx_rio_dbell_handler - MPC85xx doorbell interrupt handler
735 * @irq: Linux interrupt number
736 * @dev_instance: Pointer to interrupt-specific data
738 * Handles doorbell interrupts. Parses a list of registered
739 * doorbell event handlers and executes a matching event handler.
742 mpc85xx_rio_dbell_handler(int irq, void *dev_instance)
745 struct rio_mport *port = (struct rio_mport *)dev_instance;
747 dsr = in_be32((void *)&msg_regs->dsr);
749 if (dsr & DOORBELL_DSR_TE) {
750 pr_info("RIO: doorbell reception error\n");
751 out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_TE);
755 if (dsr & DOORBELL_DSR_QFI) {
756 pr_info("RIO: doorbell queue full\n");
757 out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_QFI);
761 /* XXX Need to check/dispatch until queue empty */
762 if (dsr & DOORBELL_DSR_DIQI) {
764 (u32) dbell_ring.virt +
765 (in_be32((void *)&msg_regs->dqdpar) & 0xfff);
767 struct rio_dbell *dbell;
771 ("RIO: processing doorbell, sid %2.2x tid %2.2x info %4.4x\n",
772 DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
774 list_for_each_entry(dbell, &port->dbells, node) {
775 if ((dbell->res->start <= DBELL_INF(dmsg)) &&
776 (dbell->res->end >= DBELL_INF(dmsg))) {
782 dbell->dinb(port, dbell->dev_id, DBELL_SID(dmsg), DBELL_TID(dmsg),
786 ("RIO: spurious doorbell, sid %2.2x tid %2.2x info %4.4x\n",
787 DBELL_SID(dmsg), DBELL_TID(dmsg), DBELL_INF(dmsg));
789 dmr = in_be32((void *)&msg_regs->dmr);
790 out_be32((void *)&msg_regs->dmr, dmr | DOORBELL_DMR_DI);
791 out_be32((void *)&msg_regs->dsr, DOORBELL_DSR_DIQI);
799 * mpc85xx_rio_doorbell_init - MPC85xx doorbell interface init
800 * @mport: Master port implementing the inbound doorbell unit
802 * Initializes doorbell unit hardware and inbound DMA buffer
803 * ring. Called from mpc85xx_rio_setup(). Returns %0 on success
804 * or %-ENOMEM on failure.
806 static int mpc85xx_rio_doorbell_init(struct rio_mport *mport)
810 /* Map outbound doorbell window immediately after maintenance window */
812 (u32) ioremap(mport->iores.start + RIO_MAINT_WIN_SIZE,
813 RIO_DBELL_WIN_SIZE))) {
815 "RIO: unable to map outbound doorbell window\n");
820 /* Initialize inbound doorbells */
821 if (!(dbell_ring.virt = dma_alloc_coherent(NULL,
822 512 * DOORBELL_MESSAGE_SIZE,
825 printk(KERN_ERR "RIO: unable allocate inbound doorbell ring\n");
827 iounmap((void *)dbell_win);
831 /* Point dequeue/enqueue pointers at first entry in ring */
832 out_be32((void *)&msg_regs->dqdpar, (u32) dbell_ring.phys);
833 out_be32((void *)&msg_regs->dqepar, (u32) dbell_ring.phys);
835 /* Clear interrupt status */
836 out_be32((void *)&msg_regs->dsr, 0x00000091);
838 /* Hook up doorbell handler */
840 request_irq(MPC85xx_IRQ_RIO_BELL, mpc85xx_rio_dbell_handler, 0,
841 "dbell_rx", (void *)mport) < 0)) {
842 iounmap((void *)dbell_win);
843 dma_free_coherent(NULL, 512 * DOORBELL_MESSAGE_SIZE,
844 dbell_ring.virt, dbell_ring.phys);
846 "MPC85xx RIO: unable to request inbound doorbell irq");
850 /* Configure doorbells for snooping, 512 entries, and enable */
851 out_be32((void *)&msg_regs->dmr, 0x00108161);
857 static char *cmdline = NULL;
859 static int mpc85xx_rio_get_hdid(int index)
861 /* XXX Need to parse multiple entries in some format */
865 return simple_strtol(cmdline, NULL, 0);
868 static int mpc85xx_rio_get_cmdline(char *s)
877 __setup("riohdid=", mpc85xx_rio_get_cmdline);
880 * mpc85xx_rio_setup - Setup MPC85xx RapidIO interface
881 * @law_start: Starting physical address of RapidIO LAW
882 * @law_size: Size of RapidIO LAW
884 * Initializes MPC85xx RapidIO hardware interface, configures
885 * master port with system-specific info, and registers the
886 * master port with the RapidIO subsystem.
888 void mpc85xx_rio_setup(int law_start, int law_size)
891 struct rio_mport *port;
893 ops = kmalloc(sizeof(struct rio_ops), GFP_KERNEL);
894 ops->lcread = mpc85xx_local_config_read;
895 ops->lcwrite = mpc85xx_local_config_write;
896 ops->cread = mpc85xx_rio_config_read;
897 ops->cwrite = mpc85xx_rio_config_write;
898 ops->dsend = mpc85xx_rio_doorbell_send;
900 port = kmalloc(sizeof(struct rio_mport), GFP_KERNEL);
903 INIT_LIST_HEAD(&port->dbells);
904 port->iores.start = law_start;
905 port->iores.end = law_start + law_size;
906 port->iores.flags = IORESOURCE_MEM;
908 rio_init_dbell_res(&port->riores[RIO_DOORBELL_RESOURCE], 0, 0xffff);
909 rio_init_mbox_res(&port->riores[RIO_INB_MBOX_RESOURCE], 0, 0);
910 rio_init_mbox_res(&port->riores[RIO_OUTB_MBOX_RESOURCE], 0, 0);
911 strcpy(port->name, "RIO0 mport");
914 port->host_deviceid = mpc85xx_rio_get_hdid(port->id);
916 rio_register_mport(port);
918 regs_win = (u32) ioremap(RIO_REGS_BASE, 0x20000);
919 atmu_regs = (struct rio_atmu_regs *)(regs_win + RIO_ATMU_REGS_OFFSET);
920 maint_atmu_regs = atmu_regs + 1;
921 dbell_atmu_regs = atmu_regs + 2;
922 msg_regs = (struct rio_msg_regs *)(regs_win + RIO_MSG_REGS_OFFSET);
924 /* Configure maintenance transaction window */
925 out_be32((void *)&maint_atmu_regs->rowbar, 0x000c0000);
926 out_be32((void *)&maint_atmu_regs->rowar, 0x80077015);
928 maint_win = (u32) ioremap(law_start, RIO_MAINT_WIN_SIZE);
930 /* Configure outbound doorbell window */
931 out_be32((void *)&dbell_atmu_regs->rowbar, 0x000c0400);
932 out_be32((void *)&dbell_atmu_regs->rowar, 0x8004200b);
933 mpc85xx_rio_doorbell_init(port);