Lines Matching refs:ctrl
44 static inline struct pci_dev *ctrl_dev(struct controller *ctrl) in ctrl_dev() argument
46 return ctrl->pcie->port; in ctrl_dev()
50 static void start_int_poll_timer(struct controller *ctrl, int sec);
55 struct controller *ctrl = (struct controller *)data; in int_poll_timeout() local
58 pcie_isr(0, ctrl); in int_poll_timeout()
60 init_timer(&ctrl->poll_timer); in int_poll_timeout()
64 start_int_poll_timer(ctrl, pciehp_poll_time); in int_poll_timeout()
68 static void start_int_poll_timer(struct controller *ctrl, int sec) in start_int_poll_timer() argument
74 ctrl->poll_timer.function = &int_poll_timeout; in start_int_poll_timer()
75 ctrl->poll_timer.data = (unsigned long)ctrl; in start_int_poll_timer()
76 ctrl->poll_timer.expires = jiffies + sec * HZ; in start_int_poll_timer()
77 add_timer(&ctrl->poll_timer); in start_int_poll_timer()
80 static inline int pciehp_request_irq(struct controller *ctrl) in pciehp_request_irq() argument
82 int retval, irq = ctrl->pcie->irq; in pciehp_request_irq()
86 init_timer(&ctrl->poll_timer); in pciehp_request_irq()
87 start_int_poll_timer(ctrl, 10); in pciehp_request_irq()
92 retval = request_irq(irq, pcie_isr, IRQF_SHARED, MY_NAME, ctrl); in pciehp_request_irq()
94 ctrl_err(ctrl, "Cannot get irq %d for the hotplug controller\n", in pciehp_request_irq()
99 static inline void pciehp_free_irq(struct controller *ctrl) in pciehp_free_irq() argument
102 del_timer_sync(&ctrl->poll_timer); in pciehp_free_irq()
104 free_irq(ctrl->pcie->irq, ctrl); in pciehp_free_irq()
107 static int pcie_poll_cmd(struct controller *ctrl, int timeout) in pcie_poll_cmd() argument
109 struct pci_dev *pdev = ctrl_dev(ctrl); in pcie_poll_cmd()
131 static void pcie_wait_cmd(struct controller *ctrl) in pcie_wait_cmd() argument
135 unsigned long cmd_timeout = ctrl->cmd_started + duration; in pcie_wait_cmd()
143 if (NO_CMD_CMPL(ctrl)) in pcie_wait_cmd()
146 if (!ctrl->cmd_busy) in pcie_wait_cmd()
159 if (ctrl->slot_ctrl & PCI_EXP_SLTCTL_HPIE && in pcie_wait_cmd()
160 ctrl->slot_ctrl & PCI_EXP_SLTCTL_CCIE) in pcie_wait_cmd()
161 rc = wait_event_timeout(ctrl->queue, !ctrl->cmd_busy, timeout); in pcie_wait_cmd()
163 rc = pcie_poll_cmd(ctrl, jiffies_to_msecs(timeout)); in pcie_wait_cmd()
174 ctrl_info(ctrl, "Timeout on hotplug command %#06x (issued %u msec ago)\n", in pcie_wait_cmd()
175 ctrl->slot_ctrl, in pcie_wait_cmd()
176 jiffies_to_msecs(jiffies - ctrl->cmd_started)); in pcie_wait_cmd()
179 static void pcie_do_write_cmd(struct controller *ctrl, u16 cmd, in pcie_do_write_cmd() argument
182 struct pci_dev *pdev = ctrl_dev(ctrl); in pcie_do_write_cmd()
185 mutex_lock(&ctrl->ctrl_lock); in pcie_do_write_cmd()
190 pcie_wait_cmd(ctrl); in pcie_do_write_cmd()
195 ctrl->cmd_busy = 1; in pcie_do_write_cmd()
198 ctrl->cmd_started = jiffies; in pcie_do_write_cmd()
199 ctrl->slot_ctrl = slot_ctrl; in pcie_do_write_cmd()
206 pcie_wait_cmd(ctrl); in pcie_do_write_cmd()
208 mutex_unlock(&ctrl->ctrl_lock); in pcie_do_write_cmd()
217 static void pcie_write_cmd(struct controller *ctrl, u16 cmd, u16 mask) in pcie_write_cmd() argument
219 pcie_do_write_cmd(ctrl, cmd, mask, true); in pcie_write_cmd()
223 static void pcie_write_cmd_nowait(struct controller *ctrl, u16 cmd, u16 mask) in pcie_write_cmd_nowait() argument
225 pcie_do_write_cmd(ctrl, cmd, mask, false); in pcie_write_cmd_nowait()
228 bool pciehp_check_link_active(struct controller *ctrl) in pciehp_check_link_active() argument
230 struct pci_dev *pdev = ctrl_dev(ctrl); in pciehp_check_link_active()
238 ctrl_dbg(ctrl, "%s: lnk_status = %x\n", __func__, lnk_status); in pciehp_check_link_active()
243 static void __pcie_wait_link_active(struct controller *ctrl, bool active) in __pcie_wait_link_active() argument
247 if (pciehp_check_link_active(ctrl) == active) in __pcie_wait_link_active()
252 if (pciehp_check_link_active(ctrl) == active) in __pcie_wait_link_active()
255 ctrl_dbg(ctrl, "Data Link Layer Link Active not %s in 1000 msec\n", in __pcie_wait_link_active()
259 static void pcie_wait_link_active(struct controller *ctrl) in pcie_wait_link_active() argument
261 __pcie_wait_link_active(ctrl, true); in pcie_wait_link_active()
290 int pciehp_check_link_status(struct controller *ctrl) in pciehp_check_link_status() argument
292 struct pci_dev *pdev = ctrl_dev(ctrl); in pciehp_check_link_status()
301 if (ctrl->link_active_reporting) in pciehp_check_link_status()
302 pcie_wait_link_active(ctrl); in pciehp_check_link_status()
308 found = pci_bus_check_dev(ctrl->pcie->port->subordinate, in pciehp_check_link_status()
312 ctrl_dbg(ctrl, "%s: lnk_status = %x\n", __func__, lnk_status); in pciehp_check_link_status()
315 ctrl_err(ctrl, "Link Training Error occurs\n"); in pciehp_check_link_status()
319 pcie_update_link_speed(ctrl->pcie->port->subordinate, lnk_status); in pciehp_check_link_status()
327 static int __pciehp_link_set(struct controller *ctrl, bool enable) in __pciehp_link_set() argument
329 struct pci_dev *pdev = ctrl_dev(ctrl); in __pciehp_link_set()
340 ctrl_dbg(ctrl, "%s: lnk_ctrl = %x\n", __func__, lnk_ctrl); in __pciehp_link_set()
344 static int pciehp_link_enable(struct controller *ctrl) in pciehp_link_enable() argument
346 return __pciehp_link_set(ctrl, true); in pciehp_link_enable()
351 struct controller *ctrl = slot->ctrl; in pciehp_get_attention_status() local
352 struct pci_dev *pdev = ctrl_dev(ctrl); in pciehp_get_attention_status()
356 ctrl_dbg(ctrl, "%s: SLOTCTRL %x, value read %x\n", __func__, in pciehp_get_attention_status()
357 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, slot_ctrl); in pciehp_get_attention_status()
377 struct controller *ctrl = slot->ctrl; in pciehp_get_power_status() local
378 struct pci_dev *pdev = ctrl_dev(ctrl); in pciehp_get_power_status()
382 ctrl_dbg(ctrl, "%s: SLOTCTRL %x value read %x\n", __func__, in pciehp_get_power_status()
383 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, slot_ctrl); in pciehp_get_power_status()
400 struct pci_dev *pdev = ctrl_dev(slot->ctrl); in pciehp_get_latch_status()
409 struct pci_dev *pdev = ctrl_dev(slot->ctrl); in pciehp_get_adapter_status()
418 struct pci_dev *pdev = ctrl_dev(slot->ctrl); in pciehp_query_power_fault()
427 struct controller *ctrl = slot->ctrl; in pciehp_set_attention_status() local
430 if (!ATTN_LED(ctrl)) in pciehp_set_attention_status()
446 pcie_write_cmd_nowait(ctrl, slot_cmd, PCI_EXP_SLTCTL_AIC); in pciehp_set_attention_status()
447 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_set_attention_status()
448 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, slot_cmd); in pciehp_set_attention_status()
453 struct controller *ctrl = slot->ctrl; in pciehp_green_led_on() local
455 if (!PWR_LED(ctrl)) in pciehp_green_led_on()
458 pcie_write_cmd_nowait(ctrl, PCI_EXP_SLTCTL_PWR_IND_ON, in pciehp_green_led_on()
460 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_green_led_on()
461 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, in pciehp_green_led_on()
467 struct controller *ctrl = slot->ctrl; in pciehp_green_led_off() local
469 if (!PWR_LED(ctrl)) in pciehp_green_led_off()
472 pcie_write_cmd_nowait(ctrl, PCI_EXP_SLTCTL_PWR_IND_OFF, in pciehp_green_led_off()
474 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_green_led_off()
475 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, in pciehp_green_led_off()
481 struct controller *ctrl = slot->ctrl; in pciehp_green_led_blink() local
483 if (!PWR_LED(ctrl)) in pciehp_green_led_blink()
486 pcie_write_cmd_nowait(ctrl, PCI_EXP_SLTCTL_PWR_IND_BLINK, in pciehp_green_led_blink()
488 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_green_led_blink()
489 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, in pciehp_green_led_blink()
495 struct controller *ctrl = slot->ctrl; in pciehp_power_on_slot() local
496 struct pci_dev *pdev = ctrl_dev(ctrl); in pciehp_power_on_slot()
505 ctrl->power_fault_detected = 0; in pciehp_power_on_slot()
507 pcie_write_cmd(ctrl, PCI_EXP_SLTCTL_PWR_ON, PCI_EXP_SLTCTL_PCC); in pciehp_power_on_slot()
508 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_power_on_slot()
509 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, in pciehp_power_on_slot()
512 retval = pciehp_link_enable(ctrl); in pciehp_power_on_slot()
514 ctrl_err(ctrl, "%s: Can not enable the link!\n", __func__); in pciehp_power_on_slot()
521 struct controller *ctrl = slot->ctrl; in pciehp_power_off_slot() local
523 pcie_write_cmd(ctrl, PCI_EXP_SLTCTL_PWR_OFF, PCI_EXP_SLTCTL_PCC); in pciehp_power_off_slot()
524 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_power_off_slot()
525 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, in pciehp_power_off_slot()
531 struct controller *ctrl = (struct controller *)dev_id; in pcie_isr() local
532 struct pci_dev *pdev = ctrl_dev(ctrl); in pcie_isr()
535 struct slot *slot = ctrl->slot; in pcie_isr()
559 ctrl_dbg(ctrl, "%s: intr_loc %x\n", __func__, intr_loc); in pcie_isr()
563 ctrl->cmd_busy = 0; in pcie_isr()
565 wake_up(&ctrl->queue); in pcie_isr()
571 ctrl_dbg(ctrl, "ignoring hotplug event %#06x (%s requested no hotplug)\n", in pcie_isr()
594 if ((intr_loc & PCI_EXP_SLTSTA_PFD) && !ctrl->power_fault_detected) { in pcie_isr()
595 ctrl->power_fault_detected = 1; in pcie_isr()
605 void pcie_enable_notification(struct controller *ctrl) in pcie_enable_notification() argument
626 if (ATTN_BUTTN(ctrl)) in pcie_enable_notification()
630 if (MRL_SENS(ctrl)) in pcie_enable_notification()
640 pcie_write_cmd_nowait(ctrl, cmd, mask); in pcie_enable_notification()
641 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pcie_enable_notification()
642 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, cmd); in pcie_enable_notification()
645 static void pcie_disable_notification(struct controller *ctrl) in pcie_disable_notification() argument
653 pcie_write_cmd(ctrl, 0, mask); in pcie_disable_notification()
654 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pcie_disable_notification()
655 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, 0); in pcie_disable_notification()
668 struct controller *ctrl = slot->ctrl; in pciehp_reset_slot() local
669 struct pci_dev *pdev = ctrl_dev(ctrl); in pciehp_reset_slot()
675 if (!ATTN_BUTTN(ctrl)) { in pciehp_reset_slot()
682 pcie_write_cmd(ctrl, 0, ctrl_mask); in pciehp_reset_slot()
683 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_reset_slot()
684 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, 0); in pciehp_reset_slot()
686 del_timer_sync(&ctrl->poll_timer); in pciehp_reset_slot()
688 pci_reset_bridge_secondary_bus(ctrl->pcie->port); in pciehp_reset_slot()
691 pcie_write_cmd_nowait(ctrl, ctrl_mask, ctrl_mask); in pciehp_reset_slot()
692 ctrl_dbg(ctrl, "%s: SLOTCTRL %x write cmd %x\n", __func__, in pciehp_reset_slot()
693 pci_pcie_cap(ctrl->pcie->port) + PCI_EXP_SLTCTL, ctrl_mask); in pciehp_reset_slot()
695 int_poll_timeout(ctrl->poll_timer.data); in pciehp_reset_slot()
700 int pcie_init_notification(struct controller *ctrl) in pcie_init_notification() argument
702 if (pciehp_request_irq(ctrl)) in pcie_init_notification()
704 pcie_enable_notification(ctrl); in pcie_init_notification()
705 ctrl->notification_enabled = 1; in pcie_init_notification()
709 static void pcie_shutdown_notification(struct controller *ctrl) in pcie_shutdown_notification() argument
711 if (ctrl->notification_enabled) { in pcie_shutdown_notification()
712 pcie_disable_notification(ctrl); in pcie_shutdown_notification()
713 pciehp_free_irq(ctrl); in pcie_shutdown_notification()
714 ctrl->notification_enabled = 0; in pcie_shutdown_notification()
718 static int pcie_init_slot(struct controller *ctrl) in pcie_init_slot() argument
726 slot->wq = alloc_workqueue("pciehp-%u", 0, 0, PSN(ctrl)); in pcie_init_slot()
730 slot->ctrl = ctrl; in pcie_init_slot()
734 ctrl->slot = slot; in pcie_init_slot()
741 static void pcie_cleanup_slot(struct controller *ctrl) in pcie_cleanup_slot() argument
743 struct slot *slot = ctrl->slot; in pcie_cleanup_slot()
749 static inline void dbg_ctrl(struct controller *ctrl) in dbg_ctrl() argument
753 struct pci_dev *pdev = ctrl->pcie->port; in dbg_ctrl()
758 ctrl_info(ctrl, "Hotplug Controller:\n"); in dbg_ctrl()
759 ctrl_info(ctrl, " Seg/Bus/Dev/Func/IRQ : %s IRQ %d\n", in dbg_ctrl()
761 ctrl_info(ctrl, " Vendor ID : 0x%04x\n", pdev->vendor); in dbg_ctrl()
762 ctrl_info(ctrl, " Device ID : 0x%04x\n", pdev->device); in dbg_ctrl()
763 ctrl_info(ctrl, " Subsystem ID : 0x%04x\n", in dbg_ctrl()
765 ctrl_info(ctrl, " Subsystem Vendor ID : 0x%04x\n", in dbg_ctrl()
767 ctrl_info(ctrl, " PCIe Cap offset : 0x%02x\n", in dbg_ctrl()
772 ctrl_info(ctrl, " PCI resource [%d] : %pR\n", in dbg_ctrl()
775 ctrl_info(ctrl, "Slot Capabilities : 0x%08x\n", ctrl->slot_cap); in dbg_ctrl()
776 ctrl_info(ctrl, " Physical Slot Number : %d\n", PSN(ctrl)); in dbg_ctrl()
777 ctrl_info(ctrl, " Attention Button : %3s\n", in dbg_ctrl()
778 ATTN_BUTTN(ctrl) ? "yes" : "no"); in dbg_ctrl()
779 ctrl_info(ctrl, " Power Controller : %3s\n", in dbg_ctrl()
780 POWER_CTRL(ctrl) ? "yes" : "no"); in dbg_ctrl()
781 ctrl_info(ctrl, " MRL Sensor : %3s\n", in dbg_ctrl()
782 MRL_SENS(ctrl) ? "yes" : "no"); in dbg_ctrl()
783 ctrl_info(ctrl, " Attention Indicator : %3s\n", in dbg_ctrl()
784 ATTN_LED(ctrl) ? "yes" : "no"); in dbg_ctrl()
785 ctrl_info(ctrl, " Power Indicator : %3s\n", in dbg_ctrl()
786 PWR_LED(ctrl) ? "yes" : "no"); in dbg_ctrl()
787 ctrl_info(ctrl, " Hot-Plug Surprise : %3s\n", in dbg_ctrl()
788 HP_SUPR_RM(ctrl) ? "yes" : "no"); in dbg_ctrl()
789 ctrl_info(ctrl, " EMI Present : %3s\n", in dbg_ctrl()
790 EMI(ctrl) ? "yes" : "no"); in dbg_ctrl()
791 ctrl_info(ctrl, " Command Completed : %3s\n", in dbg_ctrl()
792 NO_CMD_CMPL(ctrl) ? "no" : "yes"); in dbg_ctrl()
794 ctrl_info(ctrl, "Slot Status : 0x%04x\n", reg16); in dbg_ctrl()
796 ctrl_info(ctrl, "Slot Control : 0x%04x\n", reg16); in dbg_ctrl()
803 struct controller *ctrl; in pcie_init() local
807 ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL); in pcie_init()
808 if (!ctrl) { in pcie_init()
812 ctrl->pcie = dev; in pcie_init()
814 ctrl->slot_cap = slot_cap; in pcie_init()
815 mutex_init(&ctrl->ctrl_lock); in pcie_init()
816 init_waitqueue_head(&ctrl->queue); in pcie_init()
817 dbg_ctrl(ctrl); in pcie_init()
822 ctrl_dbg(ctrl, "Link Active Reporting supported\n"); in pcie_init()
823 ctrl->link_active_reporting = 1; in pcie_init()
832 …ctrl_info(ctrl, "Slot #%d AttnBtn%c AttnInd%c PwrInd%c PwrCtrl%c MRL%c Interlock%c NoCompl%c LLAct… in pcie_init()
843 if (pcie_init_slot(ctrl)) in pcie_init()
846 return ctrl; in pcie_init()
849 kfree(ctrl); in pcie_init()
854 void pciehp_release_ctrl(struct controller *ctrl) in pciehp_release_ctrl() argument
856 pcie_shutdown_notification(ctrl); in pciehp_release_ctrl()
857 pcie_cleanup_slot(ctrl); in pciehp_release_ctrl()
858 kfree(ctrl); in pciehp_release_ctrl()