Lines Matching refs:dev
47 static int aac_src_get_sync_status(struct aac_dev *dev);
52 struct aac_dev *dev; in aac_src_intr_message() local
59 dev = ctx->dev; in aac_src_intr_message()
62 if (dev->msi_enabled) { in aac_src_intr_message()
65 bellbits = src_readl(dev, MUnit.ODR_MSI); in aac_src_intr_message()
73 bellbits = src_readl(dev, MUnit.ODR_R); in aac_src_intr_message()
76 src_writel(dev, MUnit.ODR_C, bellbits); in aac_src_intr_message()
77 src_readl(dev, MUnit.ODR_C); in aac_src_intr_message()
80 src_writel(dev, MUnit.ODR_C, bellbits); in aac_src_intr_message()
81 src_readl(dev, MUnit.ODR_C); in aac_src_intr_message()
96 if (!aac_sync_mode && !dev->msi_enabled) { in aac_src_intr_message()
97 src_writel(dev, MUnit.ODR_C, bellbits); in aac_src_intr_message()
98 src_readl(dev, MUnit.ODR_C); in aac_src_intr_message()
101 if (dev->sync_fib) { in aac_src_intr_message()
102 if (dev->sync_fib->callback) in aac_src_intr_message()
103 dev->sync_fib->callback(dev->sync_fib->callback_data, in aac_src_intr_message()
104 dev->sync_fib); in aac_src_intr_message()
105 spin_lock_irqsave(&dev->sync_fib->event_lock, sflags); in aac_src_intr_message()
106 if (dev->sync_fib->flags & FIB_CONTEXT_FLAG_WAIT) { in aac_src_intr_message()
107 dev->management_fib_count--; in aac_src_intr_message()
108 up(&dev->sync_fib->event_wait); in aac_src_intr_message()
110 spin_unlock_irqrestore(&dev->sync_fib->event_lock, in aac_src_intr_message()
112 spin_lock_irqsave(&dev->sync_lock, sflags); in aac_src_intr_message()
113 if (!list_empty(&dev->sync_fib_list)) { in aac_src_intr_message()
114 entry = dev->sync_fib_list.next; in aac_src_intr_message()
115 dev->sync_fib = list_entry(entry, in aac_src_intr_message()
121 dev->sync_fib = NULL; in aac_src_intr_message()
123 spin_unlock_irqrestore(&dev->sync_lock, sflags); in aac_src_intr_message()
125 aac_adapter_sync_cmd(dev, SEND_SYNCHRONOUS_FIB, in aac_src_intr_message()
126 (u32)dev->sync_fib->hw_fib_pa, in aac_src_intr_message()
131 if (!dev->msi_enabled) in aac_src_intr_message()
138 aac_intr_normal(dev, 0, 2, 0, NULL); in aac_src_intr_message()
139 if (dev->msi_enabled) in aac_src_intr_message()
140 aac_src_access_devreg(dev, AAC_CLEAR_AIF_BIT); in aac_src_intr_message()
145 index = dev->host_rrq_idx[vector_no]; in aac_src_intr_message()
150 handle = (dev->host_rrq[index] & 0x7fffffff); in aac_src_intr_message()
157 if (dev->msi_enabled && dev->max_msix > 1) in aac_src_intr_message()
158 atomic_dec(&dev->rrq_outstanding[vector_no]); in aac_src_intr_message()
159 dev->host_rrq[index++] = 0; in aac_src_intr_message()
160 aac_intr_normal(dev, handle-1, 0, isFastResponse, NULL); in aac_src_intr_message()
161 if (index == (vector_no + 1) * dev->vector_cap) in aac_src_intr_message()
162 index = vector_no * dev->vector_cap; in aac_src_intr_message()
163 dev->host_rrq_idx[vector_no] = index; in aac_src_intr_message()
176 static void aac_src_disable_interrupt(struct aac_dev *dev) in aac_src_disable_interrupt() argument
178 src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff); in aac_src_disable_interrupt()
186 static void aac_src_enable_interrupt_message(struct aac_dev *dev) in aac_src_enable_interrupt_message() argument
188 aac_src_access_devreg(dev, AAC_ENABLE_INTERRUPT); in aac_src_enable_interrupt_message()
202 static int src_sync_cmd(struct aac_dev *dev, u32 command, in src_sync_cmd() argument
213 writel(command, &dev->IndexRegs->Mailbox[0]); in src_sync_cmd()
217 writel(p1, &dev->IndexRegs->Mailbox[1]); in src_sync_cmd()
218 writel(p2, &dev->IndexRegs->Mailbox[2]); in src_sync_cmd()
219 writel(p3, &dev->IndexRegs->Mailbox[3]); in src_sync_cmd()
220 writel(p4, &dev->IndexRegs->Mailbox[4]); in src_sync_cmd()
225 if (!dev->msi_enabled) in src_sync_cmd()
226 src_writel(dev, in src_sync_cmd()
233 src_writel(dev, MUnit.OIMR, dev->OIMR = 0xffffffff); in src_sync_cmd()
239 src_readl(dev, MUnit.OIMR); in src_sync_cmd()
244 src_writel(dev, MUnit.IDR, INBOUNDDOORBELL_0 << SRC_IDR_SHIFT); in src_sync_cmd()
246 if (!dev->sync_mode || command != SEND_SYNCHRONOUS_FIB) { in src_sync_cmd()
262 if (aac_src_get_sync_status(dev) & OUTBOUNDDOORBELL_0) { in src_sync_cmd()
266 if (dev->msi_enabled) in src_sync_cmd()
267 aac_src_access_devreg(dev, in src_sync_cmd()
270 src_writel(dev, in src_sync_cmd()
285 aac_adapter_enable_int(dev); in src_sync_cmd()
292 *status = readl(&dev->IndexRegs->Mailbox[0]); in src_sync_cmd()
294 *r1 = readl(&dev->IndexRegs->Mailbox[1]); in src_sync_cmd()
296 *r2 = readl(&dev->IndexRegs->Mailbox[2]); in src_sync_cmd()
298 *r3 = readl(&dev->IndexRegs->Mailbox[3]); in src_sync_cmd()
300 *r4 = readl(&dev->IndexRegs->Mailbox[4]); in src_sync_cmd()
302 dev->max_msix = in src_sync_cmd()
303 readl(&dev->IndexRegs->Mailbox[5]) & 0xFFFF; in src_sync_cmd()
307 if (!dev->msi_enabled) in src_sync_cmd()
308 src_writel(dev, in src_sync_cmd()
316 aac_adapter_enable_int(dev); in src_sync_cmd()
327 static void aac_src_interrupt_adapter(struct aac_dev *dev) in aac_src_interrupt_adapter() argument
329 src_sync_cmd(dev, BREAKPOINT_REQUEST, in aac_src_interrupt_adapter()
343 static void aac_src_notify_adapter(struct aac_dev *dev, u32 event) in aac_src_notify_adapter() argument
348 src_writel(dev, MUnit.ODR_C, in aac_src_notify_adapter()
352 src_writel(dev, MUnit.ODR_C, in aac_src_notify_adapter()
356 src_writel(dev, MUnit.ODR_C, in aac_src_notify_adapter()
360 src_writel(dev, MUnit.ODR_C, in aac_src_notify_adapter()
364 src_writel(dev, MUnit.ODR_C, in aac_src_notify_adapter()
368 src_writel(dev, MUnit.ODR_C, in aac_src_notify_adapter()
384 static void aac_src_start_adapter(struct aac_dev *dev) in aac_src_start_adapter() argument
390 for (i = 0; i < dev->max_msix; i++) { in aac_src_start_adapter()
391 dev->host_rrq_idx[i] = i * dev->vector_cap; in aac_src_start_adapter()
392 atomic_set(&dev->rrq_outstanding[i], 0); in aac_src_start_adapter()
394 dev->fibs_pushed_no = 0; in aac_src_start_adapter()
396 init = dev->init; in aac_src_start_adapter()
400 src_sync_cmd(dev, INIT_STRUCT_BASE_ADDRESS, (u32)(ulong)dev->init_pa, in aac_src_start_adapter()
411 static int aac_src_check_health(struct aac_dev *dev) in aac_src_check_health() argument
413 u32 status = src_readl(dev, MUnit.OMR); in aac_src_check_health()
445 struct aac_dev *dev = fib->dev; in aac_src_deliver_message() local
446 struct aac_queue *q = &dev->queues->queue[AdapNormCmdQueue]; in aac_src_deliver_message()
455 if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest && in aac_src_deliver_message()
456 dev->max_msix > 1) { in aac_src_deliver_message()
463 atomic_inc(&dev->rrq_outstanding[vector_no]); in aac_src_deliver_message()
465 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_src_deliver_message()
499 src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff); in aac_src_deliver_message()
500 src_writel(dev, MUnit.IQ_L, address & 0xffffffff); in aac_src_deliver_message()
510 static int aac_src_ioremap(struct aac_dev *dev, u32 size) in aac_src_ioremap() argument
513 iounmap(dev->regs.src.bar1); in aac_src_ioremap()
514 dev->regs.src.bar1 = NULL; in aac_src_ioremap()
515 iounmap(dev->regs.src.bar0); in aac_src_ioremap()
516 dev->base = dev->regs.src.bar0 = NULL; in aac_src_ioremap()
519 dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2), in aac_src_ioremap()
521 dev->base = NULL; in aac_src_ioremap()
522 if (dev->regs.src.bar1 == NULL) in aac_src_ioremap()
524 dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size); in aac_src_ioremap()
525 if (dev->base == NULL) { in aac_src_ioremap()
526 iounmap(dev->regs.src.bar1); in aac_src_ioremap()
527 dev->regs.src.bar1 = NULL; in aac_src_ioremap()
530 dev->IndexRegs = &((struct src_registers __iomem *) in aac_src_ioremap()
531 dev->base)->u.tupelo.IndexRegs; in aac_src_ioremap()
540 static int aac_srcv_ioremap(struct aac_dev *dev, u32 size) in aac_srcv_ioremap() argument
543 iounmap(dev->regs.src.bar0); in aac_srcv_ioremap()
544 dev->base = dev->regs.src.bar0 = NULL; in aac_srcv_ioremap()
547 dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size); in aac_srcv_ioremap()
548 if (dev->base == NULL) in aac_srcv_ioremap()
550 dev->IndexRegs = &((struct src_registers __iomem *) in aac_srcv_ioremap()
551 dev->base)->u.denali.IndexRegs; in aac_srcv_ioremap()
555 static int aac_src_restart_adapter(struct aac_dev *dev, int bled) in aac_src_restart_adapter() argument
562 dev->name, dev->id, bled); in aac_src_restart_adapter()
563 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_restart_adapter()
564 bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, in aac_src_restart_adapter()
567 !dev->doorbell_mask) in aac_src_restart_adapter()
569 else if (dev->doorbell_mask) { in aac_src_restart_adapter()
570 reset_mask = dev->doorbell_mask; in aac_src_restart_adapter()
575 if ((dev->pdev->device == PMC_DEVICE_S7 || in aac_src_restart_adapter()
576 dev->pdev->device == PMC_DEVICE_S8 || in aac_src_restart_adapter()
577 dev->pdev->device == PMC_DEVICE_S9) && dev->msi_enabled) { in aac_src_restart_adapter()
578 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_src_restart_adapter()
579 dev->msi_enabled = 0; in aac_src_restart_adapter()
583 if (!bled && (dev->supplement_adapter_info.SupportedOptions2 & in aac_src_restart_adapter()
585 src_writel(dev, MUnit.IDR, reset_mask); in aac_src_restart_adapter()
588 src_writel(dev, MUnit.IDR, 0x100); in aac_src_restart_adapter()
593 if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC) in aac_src_restart_adapter()
607 int aac_src_select_comm(struct aac_dev *dev, int comm) in aac_src_select_comm() argument
611 dev->a_ops.adapter_intr = aac_src_intr_message; in aac_src_select_comm()
612 dev->a_ops.adapter_deliver = aac_src_deliver_message; in aac_src_select_comm()
626 int aac_src_init(struct aac_dev *dev) in aac_src_init() argument
631 int instance = dev->id; in aac_src_init()
632 const char *name = dev->name; in aac_src_init()
634 dev->a_ops.adapter_ioremap = aac_src_ioremap; in aac_src_init()
635 dev->a_ops.adapter_comm = aac_src_select_comm; in aac_src_init()
637 dev->base_size = AAC_MIN_SRC_BAR0_SIZE; in aac_src_init()
638 if (aac_adapter_ioremap(dev, dev->base_size)) { in aac_src_init()
644 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_src_init()
645 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_init()
647 !aac_src_restart_adapter(dev, 0)) in aac_src_init()
652 status = src_readl(dev, MUnit.OMR); in aac_src_init()
654 if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) in aac_src_init()
661 status = src_readl(dev, MUnit.OMR); in aac_src_init()
664 dev->name, instance); in aac_src_init()
672 dev->name, instance); in aac_src_init()
679 while (!((status = src_readl(dev, MUnit.OMR)) & in aac_src_init()
685 dev->name, instance, status); in aac_src_init()
694 if (likely(!aac_src_restart_adapter(dev, in aac_src_init()
695 aac_src_check_health(dev)))) in aac_src_init()
706 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; in aac_src_init()
707 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; in aac_src_init()
708 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_init()
709 dev->a_ops.adapter_notify = aac_src_notify_adapter; in aac_src_init()
710 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_src_init()
711 dev->a_ops.adapter_check_health = aac_src_check_health; in aac_src_init()
712 dev->a_ops.adapter_restart = aac_src_restart_adapter; in aac_src_init()
718 aac_adapter_comm(dev, AAC_COMM_MESSAGE); in aac_src_init()
719 aac_adapter_disable_int(dev); in aac_src_init()
720 src_writel(dev, MUnit.ODR_C, 0xffffffff); in aac_src_init()
721 aac_adapter_enable_int(dev); in aac_src_init()
723 if (aac_init_adapter(dev) == NULL) in aac_src_init()
725 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1) in aac_src_init()
728 dev->msi = aac_msi && !pci_enable_msi(dev->pdev); in aac_src_init()
730 dev->aac_msix[0].vector_no = 0; in aac_src_init()
731 dev->aac_msix[0].dev = dev; in aac_src_init()
733 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, in aac_src_init()
734 IRQF_SHARED, "aacraid", &(dev->aac_msix[0])) < 0) { in aac_src_init()
736 if (dev->msi) in aac_src_init()
737 pci_disable_msi(dev->pdev); in aac_src_init()
743 dev->dbg_base = pci_resource_start(dev->pdev, 2); in aac_src_init()
744 dev->dbg_base_mapped = dev->regs.src.bar1; in aac_src_init()
745 dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE; in aac_src_init()
746 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; in aac_src_init()
748 aac_adapter_enable_int(dev); in aac_src_init()
750 if (!dev->sync_mode) { in aac_src_init()
755 aac_src_start_adapter(dev); in aac_src_init()
770 int aac_srcv_init(struct aac_dev *dev) in aac_srcv_init() argument
775 int instance = dev->id; in aac_srcv_init()
777 const char *name = dev->name; in aac_srcv_init()
780 dev->a_ops.adapter_ioremap = aac_srcv_ioremap; in aac_srcv_init()
781 dev->a_ops.adapter_comm = aac_src_select_comm; in aac_srcv_init()
783 dev->base_size = AAC_MIN_SRCV_BAR0_SIZE; in aac_srcv_init()
784 if (aac_adapter_ioremap(dev, dev->base_size)) { in aac_srcv_init()
790 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_srcv_init()
791 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_srcv_init()
793 !aac_src_restart_adapter(dev, 0)) in aac_srcv_init()
799 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
803 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
806 dev->name, instance); in aac_srcv_init()
820 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
822 if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) in aac_srcv_init()
829 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
831 printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance); in aac_srcv_init()
838 printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance); in aac_srcv_init()
845 while (!((status = src_readl(dev, MUnit.OMR)) & in aac_srcv_init()
852 dev->name, instance, status); in aac_srcv_init()
861 if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev)))) in aac_srcv_init()
872 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; in aac_srcv_init()
873 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; in aac_srcv_init()
874 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_srcv_init()
875 dev->a_ops.adapter_notify = aac_src_notify_adapter; in aac_srcv_init()
876 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_srcv_init()
877 dev->a_ops.adapter_check_health = aac_src_check_health; in aac_srcv_init()
878 dev->a_ops.adapter_restart = aac_src_restart_adapter; in aac_srcv_init()
884 aac_adapter_comm(dev, AAC_COMM_MESSAGE); in aac_srcv_init()
885 aac_adapter_disable_int(dev); in aac_srcv_init()
886 src_writel(dev, MUnit.ODR_C, 0xffffffff); in aac_srcv_init()
887 aac_adapter_enable_int(dev); in aac_srcv_init()
889 if (aac_init_adapter(dev) == NULL) in aac_srcv_init()
891 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2) in aac_srcv_init()
893 if (dev->msi_enabled) in aac_srcv_init()
894 aac_src_access_devreg(dev, AAC_ENABLE_MSIX); in aac_srcv_init()
895 if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) { in aac_srcv_init()
897 for (i = 0; i < dev->max_msix; i++) { in aac_srcv_init()
898 dev->aac_msix[i].vector_no = i; in aac_srcv_init()
899 dev->aac_msix[i].dev = dev; in aac_srcv_init()
901 if (request_irq(dev->msixentry[i].vector, in aac_srcv_init()
902 dev->a_ops.adapter_intr, in aac_srcv_init()
905 &(dev->aac_msix[i]))) { in aac_srcv_init()
909 free_irq(dev->msixentry[j].vector, in aac_srcv_init()
910 &(dev->aac_msix[j])); in aac_srcv_init()
911 pci_disable_msix(dev->pdev); in aac_srcv_init()
915 dev->msixentry[i].vector, in aac_srcv_init()
923 dev->aac_msix[0].vector_no = 0; in aac_srcv_init()
924 dev->aac_msix[0].dev = dev; in aac_srcv_init()
926 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, in aac_srcv_init()
929 &(dev->aac_msix[0])) < 0) { in aac_srcv_init()
930 if (dev->msi) in aac_srcv_init()
931 pci_disable_msi(dev->pdev); in aac_srcv_init()
937 dev->dbg_base = dev->base_start; in aac_srcv_init()
938 dev->dbg_base_mapped = dev->base; in aac_srcv_init()
939 dev->dbg_size = dev->base_size; in aac_srcv_init()
940 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; in aac_srcv_init()
942 aac_adapter_enable_int(dev); in aac_srcv_init()
944 if (!dev->sync_mode) { in aac_srcv_init()
949 aac_src_start_adapter(dev); in aac_srcv_init()
958 void aac_src_access_devreg(struct aac_dev *dev, int mode) in aac_src_access_devreg() argument
964 src_writel(dev, in aac_src_access_devreg()
966 dev->OIMR = (dev->msi_enabled ? in aac_src_access_devreg()
972 src_writel(dev, in aac_src_access_devreg()
974 dev->OIMR = AAC_INT_DISABLE_ALL); in aac_src_access_devreg()
979 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
981 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
982 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
985 src_writel(dev, MUnit.IOAR, val); in aac_src_access_devreg()
986 val = src_readl(dev, MUnit.OIMR); in aac_src_access_devreg()
987 src_writel(dev, in aac_src_access_devreg()
994 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
996 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
997 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1002 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1004 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
1005 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1010 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1012 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
1013 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1018 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1020 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
1021 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
1024 src_writel(dev, MUnit.IOAR, val); in aac_src_access_devreg()
1025 src_readl(dev, MUnit.IOAR); in aac_src_access_devreg()
1026 val = src_readl(dev, MUnit.OIMR); in aac_src_access_devreg()
1027 src_writel(dev, MUnit.OIMR, in aac_src_access_devreg()
1036 static int aac_src_get_sync_status(struct aac_dev *dev) in aac_src_get_sync_status() argument
1041 if (dev->msi_enabled) in aac_src_get_sync_status()
1042 val = src_readl(dev, MUnit.ODR_MSI) & 0x1000 ? 1 : 0; in aac_src_get_sync_status()
1044 val = src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT; in aac_src_get_sync_status()