Lines Matching refs:link

47 	struct list_head link;		/* node in parent's children list */  member
96 static int policy_to_aspm_state(struct pcie_link_state *link) in policy_to_aspm_state() argument
106 return link->aspm_default; in policy_to_aspm_state()
111 static int policy_to_clkpm_state(struct pcie_link_state *link) in policy_to_clkpm_state() argument
121 return link->clkpm_default; in policy_to_clkpm_state()
126 static void pcie_set_clkpm_nocheck(struct pcie_link_state *link, int enable) in pcie_set_clkpm_nocheck() argument
129 struct pci_bus *linkbus = link->pdev->subordinate; in pcie_set_clkpm_nocheck()
139 link->clkpm_enabled = !!enable; in pcie_set_clkpm_nocheck()
142 static void pcie_set_clkpm(struct pcie_link_state *link, int enable) in pcie_set_clkpm() argument
145 if (!link->clkpm_capable && enable) in pcie_set_clkpm()
148 if (link->clkpm_enabled == enable) in pcie_set_clkpm()
150 pcie_set_clkpm_nocheck(link, enable); in pcie_set_clkpm()
153 static void pcie_clkpm_cap_init(struct pcie_link_state *link, int blacklist) in pcie_clkpm_cap_init() argument
159 struct pci_bus *linkbus = link->pdev->subordinate; in pcie_clkpm_cap_init()
173 link->clkpm_enabled = enabled; in pcie_clkpm_cap_init()
174 link->clkpm_default = enabled; in pcie_clkpm_cap_init()
175 link->clkpm_capable = (blacklist) ? 0 : capable; in pcie_clkpm_cap_init()
183 static void pcie_aspm_configure_common_clock(struct pcie_link_state *link) in pcie_aspm_configure_common_clock() argument
188 struct pci_dev *child, *parent = link->pdev; in pcie_aspm_configure_common_clock()
309 struct pcie_link_state *link; in pcie_aspm_check_latency() local
316 link = endpoint->bus->self->link_state; in pcie_aspm_check_latency()
317 acceptable = &link->acceptable[PCI_FUNC(endpoint->devfn)]; in pcie_aspm_check_latency()
319 while (link) { in pcie_aspm_check_latency()
321 if ((link->aspm_capable & ASPM_STATE_L0S_UP) && in pcie_aspm_check_latency()
322 (link->latency_up.l0s > acceptable->l0s)) in pcie_aspm_check_latency()
323 link->aspm_capable &= ~ASPM_STATE_L0S_UP; in pcie_aspm_check_latency()
326 if ((link->aspm_capable & ASPM_STATE_L0S_DW) && in pcie_aspm_check_latency()
327 (link->latency_dw.l0s > acceptable->l0s)) in pcie_aspm_check_latency()
328 link->aspm_capable &= ~ASPM_STATE_L0S_DW; in pcie_aspm_check_latency()
334 latency = max_t(u32, link->latency_up.l1, link->latency_dw.l1); in pcie_aspm_check_latency()
335 if ((link->aspm_capable & ASPM_STATE_L1) && in pcie_aspm_check_latency()
337 link->aspm_capable &= ~ASPM_STATE_L1; in pcie_aspm_check_latency()
340 link = link->parent; in pcie_aspm_check_latency()
344 static void pcie_aspm_cap_init(struct pcie_link_state *link, int blacklist) in pcie_aspm_cap_init() argument
346 struct pci_dev *child, *parent = link->pdev; in pcie_aspm_cap_init()
352 link->aspm_enabled = ASPM_STATE_ALL; in pcie_aspm_cap_init()
353 link->aspm_disable = ASPM_STATE_ALL; in pcie_aspm_cap_init()
358 pcie_aspm_configure_common_clock(link); in pcie_aspm_cap_init()
373 link->aspm_support |= ASPM_STATE_L0S; in pcie_aspm_cap_init()
375 link->aspm_enabled |= ASPM_STATE_L0S_UP; in pcie_aspm_cap_init()
377 link->aspm_enabled |= ASPM_STATE_L0S_DW; in pcie_aspm_cap_init()
378 link->latency_up.l0s = calc_l0s_latency(upreg.latency_encoding_l0s); in pcie_aspm_cap_init()
379 link->latency_dw.l0s = calc_l0s_latency(dwreg.latency_encoding_l0s); in pcie_aspm_cap_init()
383 link->aspm_support |= ASPM_STATE_L1; in pcie_aspm_cap_init()
385 link->aspm_enabled |= ASPM_STATE_L1; in pcie_aspm_cap_init()
386 link->latency_up.l1 = calc_l1_latency(upreg.latency_encoding_l1); in pcie_aspm_cap_init()
387 link->latency_dw.l1 = calc_l1_latency(dwreg.latency_encoding_l1); in pcie_aspm_cap_init()
390 link->aspm_default = link->aspm_enabled; in pcie_aspm_cap_init()
393 link->aspm_capable = link->aspm_support; in pcie_aspm_cap_init()
400 link->aspm_disable = ASPM_STATE_ALL; in pcie_aspm_cap_init()
409 &link->acceptable[PCI_FUNC(child->devfn)]; in pcie_aspm_cap_init()
433 static void pcie_config_aspm_link(struct pcie_link_state *link, u32 state) in pcie_config_aspm_link() argument
436 struct pci_dev *child, *parent = link->pdev; in pcie_config_aspm_link()
440 state &= (link->aspm_capable & ~link->aspm_disable); in pcie_config_aspm_link()
441 if (link->aspm_enabled == state) in pcie_config_aspm_link()
465 link->aspm_enabled = state; in pcie_config_aspm_link()
468 static void pcie_config_aspm_path(struct pcie_link_state *link) in pcie_config_aspm_path() argument
470 while (link) { in pcie_config_aspm_path()
471 pcie_config_aspm_link(link, policy_to_aspm_state(link)); in pcie_config_aspm_path()
472 link = link->parent; in pcie_config_aspm_path()
476 static void free_link_state(struct pcie_link_state *link) in free_link_state() argument
478 link->pdev->link_state = NULL; in free_link_state()
479 kfree(link); in free_link_state()
519 struct pcie_link_state *link; in alloc_pcie_link_state() local
521 link = kzalloc(sizeof(*link), GFP_KERNEL); in alloc_pcie_link_state()
522 if (!link) in alloc_pcie_link_state()
524 INIT_LIST_HEAD(&link->sibling); in alloc_pcie_link_state()
525 INIT_LIST_HEAD(&link->children); in alloc_pcie_link_state()
526 INIT_LIST_HEAD(&link->link); in alloc_pcie_link_state()
527 link->pdev = pdev; in alloc_pcie_link_state()
532 kfree(link); in alloc_pcie_link_state()
535 link->parent = parent; in alloc_pcie_link_state()
536 list_add(&link->link, &parent->children); in alloc_pcie_link_state()
539 if (!link->parent) in alloc_pcie_link_state()
540 link->root = link; in alloc_pcie_link_state()
542 link->root = link->parent->root; in alloc_pcie_link_state()
544 list_add(&link->sibling, &link_list); in alloc_pcie_link_state()
545 pdev->link_state = link; in alloc_pcie_link_state()
546 return link; in alloc_pcie_link_state()
556 struct pcie_link_state *link; in pcie_aspm_init_link_state() local
578 link = alloc_pcie_link_state(pdev); in pcie_aspm_init_link_state()
579 if (!link) in pcie_aspm_init_link_state()
586 pcie_aspm_cap_init(link, blacklist); in pcie_aspm_init_link_state()
589 pcie_clkpm_cap_init(link, blacklist); in pcie_aspm_init_link_state()
600 pcie_config_aspm_path(link); in pcie_aspm_init_link_state()
601 pcie_set_clkpm(link, policy_to_clkpm_state(link)); in pcie_aspm_init_link_state()
613 struct pcie_link_state *link; in pcie_update_aspm_capable() local
615 list_for_each_entry(link, &link_list, sibling) { in pcie_update_aspm_capable()
616 if (link->root != root) in pcie_update_aspm_capable()
618 link->aspm_capable = link->aspm_support; in pcie_update_aspm_capable()
620 list_for_each_entry(link, &link_list, sibling) { in pcie_update_aspm_capable()
622 struct pci_bus *linkbus = link->pdev->subordinate; in pcie_update_aspm_capable()
623 if (link->root != root) in pcie_update_aspm_capable()
638 struct pcie_link_state *link, *root, *parent_link; in pcie_aspm_exit_link_state() local
652 link = parent->link_state; in pcie_aspm_exit_link_state()
653 root = link->root; in pcie_aspm_exit_link_state()
654 parent_link = link->parent; in pcie_aspm_exit_link_state()
657 pcie_config_aspm_link(link, 0); in pcie_aspm_exit_link_state()
658 list_del(&link->sibling); in pcie_aspm_exit_link_state()
659 list_del(&link->link); in pcie_aspm_exit_link_state()
661 free_link_state(link); in pcie_aspm_exit_link_state()
676 struct pcie_link_state *link = pdev->link_state; in pcie_aspm_pm_state_change() local
678 if (aspm_disabled || !pci_is_pcie(pdev) || !link) in pcie_aspm_pm_state_change()
689 pcie_update_aspm_capable(link->root); in pcie_aspm_pm_state_change()
690 pcie_config_aspm_path(link); in pcie_aspm_pm_state_change()
697 struct pcie_link_state *link = pdev->link_state; in pcie_aspm_powersave_config_link() local
699 if (aspm_disabled || !pci_is_pcie(pdev) || !link) in pcie_aspm_powersave_config_link()
711 pcie_config_aspm_path(link); in pcie_aspm_powersave_config_link()
712 pcie_set_clkpm(link, policy_to_clkpm_state(link)); in pcie_aspm_powersave_config_link()
721 struct pcie_link_state *link; in __pci_disable_link_state() local
748 link = parent->link_state; in __pci_disable_link_state()
750 link->aspm_disable |= ASPM_STATE_L0S; in __pci_disable_link_state()
752 link->aspm_disable |= ASPM_STATE_L1; in __pci_disable_link_state()
753 pcie_config_aspm_link(link, policy_to_aspm_state(link)); in __pci_disable_link_state()
756 link->clkpm_capable = 0; in __pci_disable_link_state()
757 pcie_set_clkpm(link, 0); in __pci_disable_link_state()
788 struct pcie_link_state *link; in pcie_aspm_set_policy() local
803 list_for_each_entry(link, &link_list, sibling) { in pcie_aspm_set_policy()
804 pcie_config_aspm_link(link, policy_to_aspm_state(link)); in pcie_aspm_set_policy()
805 pcie_set_clkpm(link, policy_to_clkpm_state(link)); in pcie_aspm_set_policy()
843 struct pcie_link_state *link, *root = pdev->link_state->root; in link_state_store() local
862 list_for_each_entry(link, &link_list, sibling) { in link_state_store()
863 if (link->root != root) in link_state_store()
865 pcie_config_aspm_link(link, state); in link_state_store()