Skip to content
Permalink
Browse files
PCI/ASPM: Add ASPM BIOS override function
Devices that appear under the Intel VMD host bridge are not visible to BIOS
and therefore not programmed by BIOS with ASPM settings. For these devices,
it is necessary for the driver to configure ASPM. Since ASPM settings are
adjustable at runtime by module parameter, use the same mechanism to allow
drivers to override the default (in this case never configured) BIOS policy
to ASPM_STATE_ALL. Then, reconfigure ASPM on the link. Do not override if
ASPM control is disabled.

Signed-off-by: Michael Bottini <michael.a.bottini@linux.intel.com>
Signed-off-by: David E. Box <david.e.box@linux.intel.com>
  • Loading branch information
Michael Bottini authored and intel-lab-lkp committed Dec 7, 2021
1 parent 0fcfb00 commit efd5524bd4005ec84d4eb6681c54d1ba93fe9ca1
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
@@ -562,11 +562,13 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev);
void pcie_aspm_exit_link_state(struct pci_dev *pdev);
void pcie_aspm_pm_state_change(struct pci_dev *pdev);
void pcie_aspm_powersave_config_link(struct pci_dev *pdev);
int pcie_aspm_policy_override(struct pci_dev *dev);
#else
static inline void pcie_aspm_init_link_state(struct pci_dev *pdev) { }
static inline void pcie_aspm_exit_link_state(struct pci_dev *pdev) { }
static inline void pcie_aspm_pm_state_change(struct pci_dev *pdev) { }
static inline void pcie_aspm_powersave_config_link(struct pci_dev *pdev) { }
static inline int pcie_aspm_policy_override(struct pci_dev *dev) { return -EINVAL }
#endif

#ifdef CONFIG_PCIE_ECRC
@@ -1140,6 +1140,25 @@ int pci_disable_link_state(struct pci_dev *pdev, int state)
}
EXPORT_SYMBOL(pci_disable_link_state);

int pcie_aspm_policy_override(struct pci_dev *pdev)
{
struct pcie_link_state *link = pcie_aspm_get_link(pdev);

if (!link || aspm_disabled)
return -EINVAL;

down_read(&pci_bus_sem);
mutex_lock(&aspm_lock);
link->aspm_default = ASPM_STATE_ALL;
pcie_config_aspm_link(link, policy_to_aspm_state(link));
pcie_set_clkpm(link, policy_to_clkpm_state(link));
mutex_unlock(&aspm_lock);
up_read(&pci_bus_sem);

return 0;
}
EXPORT_SYMBOL(pcie_aspm_policy_override);

static int pcie_aspm_set_policy(const char *val,
const struct kernel_param *kp)
{

0 comments on commit efd5524

Please sign in to comment.