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()
459 if (dev->msi_enabled && fib->hw_fib_va->header.Command != AifRequest && in aac_src_deliver_message()
460 dev->max_msix > 1) { in aac_src_deliver_message()
467 atomic_inc(&dev->rrq_outstanding[vector_no]); in aac_src_deliver_message()
469 if (dev->comm_interface == AAC_COMM_MESSAGE_TYPE2) { in aac_src_deliver_message()
503 src_writeq(dev, MUnit.IQ_L, (u64)address); in aac_src_deliver_message()
505 spin_lock_irqsave(&fib->dev->iq_lock, flags); in aac_src_deliver_message()
506 src_writel(dev, MUnit.IQ_H, upper_32_bits(address) & 0xffffffff); in aac_src_deliver_message()
507 src_writel(dev, MUnit.IQ_L, address & 0xffffffff); in aac_src_deliver_message()
508 spin_unlock_irqrestore(&fib->dev->iq_lock, flags); in aac_src_deliver_message()
518 static int aac_src_ioremap(struct aac_dev *dev, u32 size) in aac_src_ioremap() argument
521 iounmap(dev->regs.src.bar1); in aac_src_ioremap()
522 dev->regs.src.bar1 = NULL; in aac_src_ioremap()
523 iounmap(dev->regs.src.bar0); in aac_src_ioremap()
524 dev->base = dev->regs.src.bar0 = NULL; in aac_src_ioremap()
527 dev->regs.src.bar1 = ioremap(pci_resource_start(dev->pdev, 2), in aac_src_ioremap()
529 dev->base = NULL; in aac_src_ioremap()
530 if (dev->regs.src.bar1 == NULL) in aac_src_ioremap()
532 dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size); in aac_src_ioremap()
533 if (dev->base == NULL) { in aac_src_ioremap()
534 iounmap(dev->regs.src.bar1); in aac_src_ioremap()
535 dev->regs.src.bar1 = NULL; in aac_src_ioremap()
538 dev->IndexRegs = &((struct src_registers __iomem *) in aac_src_ioremap()
539 dev->base)->u.tupelo.IndexRegs; in aac_src_ioremap()
548 static int aac_srcv_ioremap(struct aac_dev *dev, u32 size) in aac_srcv_ioremap() argument
551 iounmap(dev->regs.src.bar0); in aac_srcv_ioremap()
552 dev->base = dev->regs.src.bar0 = NULL; in aac_srcv_ioremap()
555 dev->base = dev->regs.src.bar0 = ioremap(dev->base_start, size); in aac_srcv_ioremap()
556 if (dev->base == NULL) in aac_srcv_ioremap()
558 dev->IndexRegs = &((struct src_registers __iomem *) in aac_srcv_ioremap()
559 dev->base)->u.denali.IndexRegs; in aac_srcv_ioremap()
563 static int aac_src_restart_adapter(struct aac_dev *dev, int bled) in aac_src_restart_adapter() argument
570 dev->name, dev->id, bled); in aac_src_restart_adapter()
571 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_restart_adapter()
572 bled = aac_adapter_sync_cmd(dev, IOP_RESET_ALWAYS, in aac_src_restart_adapter()
575 !dev->doorbell_mask) in aac_src_restart_adapter()
577 else if (dev->doorbell_mask) { in aac_src_restart_adapter()
578 reset_mask = dev->doorbell_mask; in aac_src_restart_adapter()
583 if ((dev->pdev->device == PMC_DEVICE_S7 || in aac_src_restart_adapter()
584 dev->pdev->device == PMC_DEVICE_S8 || in aac_src_restart_adapter()
585 dev->pdev->device == PMC_DEVICE_S9) && dev->msi_enabled) { in aac_src_restart_adapter()
586 aac_src_access_devreg(dev, AAC_ENABLE_INTX); in aac_src_restart_adapter()
587 dev->msi_enabled = 0; in aac_src_restart_adapter()
591 if (!bled && (dev->supplement_adapter_info.SupportedOptions2 & in aac_src_restart_adapter()
593 src_writel(dev, MUnit.IDR, reset_mask); in aac_src_restart_adapter()
596 src_writel(dev, MUnit.IDR, 0x100); in aac_src_restart_adapter()
601 if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC) in aac_src_restart_adapter()
615 int aac_src_select_comm(struct aac_dev *dev, int comm) in aac_src_select_comm() argument
619 dev->a_ops.adapter_intr = aac_src_intr_message; in aac_src_select_comm()
620 dev->a_ops.adapter_deliver = aac_src_deliver_message; in aac_src_select_comm()
634 int aac_src_init(struct aac_dev *dev) in aac_src_init() argument
639 int instance = dev->id; in aac_src_init()
640 const char *name = dev->name; in aac_src_init()
642 dev->a_ops.adapter_ioremap = aac_src_ioremap; in aac_src_init()
643 dev->a_ops.adapter_comm = aac_src_select_comm; in aac_src_init()
645 dev->base_size = AAC_MIN_SRC_BAR0_SIZE; in aac_src_init()
646 if (aac_adapter_ioremap(dev, dev->base_size)) { in aac_src_init()
652 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_src_init()
653 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_init()
655 !aac_src_restart_adapter(dev, 0)) in aac_src_init()
660 status = src_readl(dev, MUnit.OMR); in aac_src_init()
662 if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) in aac_src_init()
669 status = src_readl(dev, MUnit.OMR); in aac_src_init()
672 dev->name, instance); in aac_src_init()
680 dev->name, instance); in aac_src_init()
687 while (!((status = src_readl(dev, MUnit.OMR)) & in aac_src_init()
693 dev->name, instance, status); in aac_src_init()
702 if (likely(!aac_src_restart_adapter(dev, in aac_src_init()
703 aac_src_check_health(dev)))) in aac_src_init()
714 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; in aac_src_init()
715 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; in aac_src_init()
716 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_src_init()
717 dev->a_ops.adapter_notify = aac_src_notify_adapter; in aac_src_init()
718 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_src_init()
719 dev->a_ops.adapter_check_health = aac_src_check_health; in aac_src_init()
720 dev->a_ops.adapter_restart = aac_src_restart_adapter; in aac_src_init()
721 dev->a_ops.adapter_start = aac_src_start_adapter; in aac_src_init()
727 aac_adapter_comm(dev, AAC_COMM_MESSAGE); in aac_src_init()
728 aac_adapter_disable_int(dev); in aac_src_init()
729 src_writel(dev, MUnit.ODR_C, 0xffffffff); in aac_src_init()
730 aac_adapter_enable_int(dev); in aac_src_init()
732 if (aac_init_adapter(dev) == NULL) in aac_src_init()
734 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE1) in aac_src_init()
737 dev->msi = !pci_enable_msi(dev->pdev); in aac_src_init()
739 dev->aac_msix[0].vector_no = 0; in aac_src_init()
740 dev->aac_msix[0].dev = dev; in aac_src_init()
742 if (request_irq(dev->pdev->irq, dev->a_ops.adapter_intr, in aac_src_init()
743 IRQF_SHARED, "aacraid", &(dev->aac_msix[0])) < 0) { in aac_src_init()
745 if (dev->msi) in aac_src_init()
746 pci_disable_msi(dev->pdev); in aac_src_init()
752 dev->dbg_base = pci_resource_start(dev->pdev, 2); in aac_src_init()
753 dev->dbg_base_mapped = dev->regs.src.bar1; in aac_src_init()
754 dev->dbg_size = AAC_MIN_SRC_BAR1_SIZE; in aac_src_init()
755 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; in aac_src_init()
757 aac_adapter_enable_int(dev); in aac_src_init()
759 if (!dev->sync_mode) { in aac_src_init()
764 aac_src_start_adapter(dev); in aac_src_init()
779 int aac_srcv_init(struct aac_dev *dev) in aac_srcv_init() argument
784 int instance = dev->id; in aac_srcv_init()
785 const char *name = dev->name; in aac_srcv_init()
787 dev->a_ops.adapter_ioremap = aac_srcv_ioremap; in aac_srcv_init()
788 dev->a_ops.adapter_comm = aac_src_select_comm; in aac_srcv_init()
790 dev->base_size = AAC_MIN_SRCV_BAR0_SIZE; in aac_srcv_init()
791 if (aac_adapter_ioremap(dev, dev->base_size)) { in aac_srcv_init()
797 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_srcv_init()
798 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_srcv_init()
800 !aac_src_restart_adapter(dev, 0)) in aac_srcv_init()
806 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
810 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
813 dev->name, instance); in aac_srcv_init()
827 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
829 if (aac_src_restart_adapter(dev, aac_src_check_health(dev))) in aac_srcv_init()
836 status = src_readl(dev, MUnit.OMR); in aac_srcv_init()
838 printk(KERN_ERR "%s%d: adapter self-test failed.\n", dev->name, instance); in aac_srcv_init()
845 printk(KERN_ERR "%s%d: adapter monitor panic.\n", dev->name, instance); in aac_srcv_init()
852 while (!((status = src_readl(dev, MUnit.OMR)) & in aac_srcv_init()
859 dev->name, instance, status); in aac_srcv_init()
868 if (likely(!aac_src_restart_adapter(dev, aac_src_check_health(dev)))) in aac_srcv_init()
879 dev->a_ops.adapter_interrupt = aac_src_interrupt_adapter; in aac_srcv_init()
880 dev->a_ops.adapter_disable_int = aac_src_disable_interrupt; in aac_srcv_init()
881 dev->a_ops.adapter_enable_int = aac_src_disable_interrupt; in aac_srcv_init()
882 dev->a_ops.adapter_notify = aac_src_notify_adapter; in aac_srcv_init()
883 dev->a_ops.adapter_sync_cmd = src_sync_cmd; in aac_srcv_init()
884 dev->a_ops.adapter_check_health = aac_src_check_health; in aac_srcv_init()
885 dev->a_ops.adapter_restart = aac_src_restart_adapter; in aac_srcv_init()
886 dev->a_ops.adapter_start = aac_src_start_adapter; in aac_srcv_init()
892 aac_adapter_comm(dev, AAC_COMM_MESSAGE); in aac_srcv_init()
893 aac_adapter_disable_int(dev); in aac_srcv_init()
894 src_writel(dev, MUnit.ODR_C, 0xffffffff); in aac_srcv_init()
895 aac_adapter_enable_int(dev); in aac_srcv_init()
897 if (aac_init_adapter(dev) == NULL) in aac_srcv_init()
899 if (dev->comm_interface != AAC_COMM_MESSAGE_TYPE2) in aac_srcv_init()
901 if (dev->msi_enabled) in aac_srcv_init()
902 aac_src_access_devreg(dev, AAC_ENABLE_MSIX); in aac_srcv_init()
904 if (aac_acquire_irq(dev)) in aac_srcv_init()
907 dev->dbg_base = dev->base_start; in aac_srcv_init()
908 dev->dbg_base_mapped = dev->base; in aac_srcv_init()
909 dev->dbg_size = dev->base_size; in aac_srcv_init()
910 dev->a_ops.adapter_enable_int = aac_src_enable_interrupt_message; in aac_srcv_init()
912 aac_adapter_enable_int(dev); in aac_srcv_init()
914 if (!dev->sync_mode) { in aac_srcv_init()
919 aac_src_start_adapter(dev); in aac_srcv_init()
928 void aac_src_access_devreg(struct aac_dev *dev, int mode) in aac_src_access_devreg() argument
934 src_writel(dev, in aac_src_access_devreg()
936 dev->OIMR = (dev->msi_enabled ? in aac_src_access_devreg()
942 src_writel(dev, in aac_src_access_devreg()
944 dev->OIMR = AAC_INT_DISABLE_ALL); in aac_src_access_devreg()
949 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
951 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
952 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
955 src_writel(dev, MUnit.IOAR, val); in aac_src_access_devreg()
956 val = src_readl(dev, MUnit.OIMR); in aac_src_access_devreg()
957 src_writel(dev, in aac_src_access_devreg()
964 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
966 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
967 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
972 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
974 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
975 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
980 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
982 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
983 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
988 val = src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
990 src_writel(dev, MUnit.IDR, val); in aac_src_access_devreg()
991 src_readl(dev, MUnit.IDR); in aac_src_access_devreg()
994 src_writel(dev, MUnit.IOAR, val); in aac_src_access_devreg()
995 src_readl(dev, MUnit.IOAR); in aac_src_access_devreg()
996 val = src_readl(dev, MUnit.OIMR); in aac_src_access_devreg()
997 src_writel(dev, MUnit.OIMR, in aac_src_access_devreg()
1006 static int aac_src_get_sync_status(struct aac_dev *dev) in aac_src_get_sync_status() argument
1011 if (dev->msi_enabled) in aac_src_get_sync_status()
1012 val = src_readl(dev, MUnit.ODR_MSI) & 0x1000 ? 1 : 0; in aac_src_get_sync_status()
1014 val = src_readl(dev, MUnit.ODR_R) >> SRC_ODR_SHIFT; in aac_src_get_sync_status()