aboutsummaryrefslogtreecommitdiff
path: root/nixos/modules/kernel-patches/0022-PCI-aardvark-Send-Set_Slot_Power_Limit-message.patch
diff options
context:
space:
mode:
Diffstat (limited to 'nixos/modules/kernel-patches/0022-PCI-aardvark-Send-Set_Slot_Power_Limit-message.patch')
-rw-r--r--nixos/modules/kernel-patches/0022-PCI-aardvark-Send-Set_Slot_Power_Limit-message.patch148
1 files changed, 0 insertions, 148 deletions
diff --git a/nixos/modules/kernel-patches/0022-PCI-aardvark-Send-Set_Slot_Power_Limit-message.patch b/nixos/modules/kernel-patches/0022-PCI-aardvark-Send-Set_Slot_Power_Limit-message.patch
deleted file mode 100644
index 2c64e5b..0000000
--- a/nixos/modules/kernel-patches/0022-PCI-aardvark-Send-Set_Slot_Power_Limit-message.patch
+++ /dev/null
@@ -1,148 +0,0 @@
-From 6f717ca06ec6ba55ec97851763dbd4e26fe7ea0f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Pali=20Roh=C3=A1r?= <pali@kernel.org>
-Date: Wed, 31 Aug 2022 15:57:01 +0200
-Subject: [PATCH 22/96] PCI: aardvark: Send Set_Slot_Power_Limit message
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Emulate Slot PowerLimit Scale and Value bits in the Slot Capabilities
-register of the emulated bridge and if slot power limit value is
-defined, send that Set_Slot_Power_Limit message via Message Generation
-Control Register in Link Up handler on link up event.
-
-Slot power limit value is read from device-tree property
-'slot-power-limit-milliwatt'. If this property is not specified, we
-treat it as "Slot Capabilities register has not yet been initialized".
-
-According to PCIe Base specification 3.0, when transitioning from a
-non-DL_Up Status to a DL_Up Status, the Port must initiate the
-transmission of a Set_Slot_Power_Limit Message to the other component
-on the Link to convey the value programmed in the Slot Power Limit
-Scale and Value fields of the Slot Capabilities register. This
-transmission is optional if the Slot Capabilities register has not
-yet been initialized.
-
-Signed-off-by: Pali Rohár <pali@kernel.org>
-Signed-off-by: Marek Behún <kabel@kernel.org>
----
- drivers/pci/controller/pci-aardvark.c | 51 ++++++++++++++++++++++++---
- 1 file changed, 47 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/pci/controller/pci-aardvark.c b/drivers/pci/controller/pci-aardvark.c
-index b2f143191313..656e4ea95e2e 100644
---- a/drivers/pci/controller/pci-aardvark.c
-+++ b/drivers/pci/controller/pci-aardvark.c
-@@ -214,6 +214,11 @@ enum {
- };
-
- #define VENDOR_ID_REG (LMI_BASE_ADDR + 0x44)
-+#define PME_MSG_GEN_CTRL (LMI_BASE_ADDR + 0x220)
-+#define SEND_SET_SLOT_POWER_LIMIT BIT(13)
-+#define SEND_PME_TURN_OFF BIT(14)
-+#define SLOT_POWER_LIMIT_DATA_SHIFT 16
-+#define SLOT_POWER_LIMIT_DATA_MASK GENMASK(25, 16)
-
- /* PCIe core controller registers */
- #define CTRL_CORE_BASE_ADDR 0x18000
-@@ -286,6 +291,8 @@ struct advk_pcie {
- raw_spinlock_t msi_irq_lock;
- DECLARE_BITMAP(msi_used, MSI_IRQ_NUM);
- struct mutex msi_used_lock;
-+ u8 slot_power_limit_value;
-+ u8 slot_power_limit_scale;
- int link_gen;
- bool link_was_up;
- struct timer_list link_irq_timer;
-@@ -318,8 +325,9 @@ static inline bool advk_pcie_link_up(struct advk_pcie *pcie)
- {
- /* check if LTSSM is in normal operation - some L* state */
- u8 ltssm_state = advk_pcie_ltssm_state(pcie);
-+ u16 slotsta, slotctl;
-+ u32 slotpwr, val;
- bool link_is_up;
-- u16 slotsta;
-
- link_is_up = ltssm_state >= LTSSM_L0 && ltssm_state < LTSSM_DISABLED;
-
-@@ -333,6 +341,27 @@ static inline bool advk_pcie_link_up(struct advk_pcie *pcie)
- pcie->bridge.pcie_conf.slotsta = cpu_to_le16(slotsta);
-
- mod_timer(&pcie->link_irq_timer, jiffies + 1);
-+
-+ /*
-+ * According to PCIe Base specification 3.0, when transitioning
-+ * from a non-DL_Up Status to a DL_Up Status, the Port must
-+ * initiate the transmission of a Set_Slot_Power_Limit Message
-+ * to the other component on the Link to convey the value
-+ * programmed in the Slot Power Limit Scale and Value fields of
-+ * the Slot Capabilities register. This transmission is optional
-+ * if the Slot Capabilities register has not yet been
-+ * initialized.
-+ */
-+ slotctl = le16_to_cpu(pcie->bridge.pcie_conf.slotctl);
-+ slotpwr = FIELD_GET(PCI_EXP_SLTCAP_SPLV | PCI_EXP_SLTCAP_SPLS,
-+ le32_to_cpu(pcie->bridge.pcie_conf.slotcap));
-+ if (!(slotctl & PCI_EXP_SLTCTL_ASPL_DISABLE) && slotpwr) {
-+ val = advk_readl(pcie, PME_MSG_GEN_CTRL);
-+ val &= ~SLOT_POWER_LIMIT_DATA_MASK;
-+ val |= slotpwr << SLOT_POWER_LIMIT_DATA_SHIFT;
-+ val |= SEND_SET_SLOT_POWER_LIMIT;
-+ advk_writel(pcie, val, PME_MSG_GEN_CTRL);
-+ }
- }
-
- return link_is_up;
-@@ -945,8 +974,9 @@ advk_pci_bridge_emul_pcie_conf_write(struct pci_bridge_emul *bridge,
-
- case PCI_EXP_SLTCTL: {
- u16 slotctl = le16_to_cpu(bridge->pcie_conf.slotctl);
-- /* Only emulation of HPIE and DLLSCE bits is provided */
-- slotctl &= PCI_EXP_SLTCTL_HPIE | PCI_EXP_SLTCTL_DLLSCE;
-+ /* Only emulation of HPIE, DLLSCE and ASPLD bits is provided */
-+ slotctl &= PCI_EXP_SLTCTL_HPIE | PCI_EXP_SLTCTL_DLLSCE |
-+ PCI_EXP_SLTCTL_ASPL_DISABLE;
- bridge->pcie_conf.slotctl = cpu_to_le16(slotctl);
- break;
- }
-@@ -1110,9 +1140,13 @@ static int advk_sw_pci_bridge_init(struct advk_pcie *pcie)
- * Set physical slot number to 1 since there is only one port and zero
- * value is reserved for ports within the same silicon as Root Port
- * which is not our case.
-+ *
-+ * Set slot power limit.
- */
- slotcap = PCI_EXP_SLTCAP_NCCS | PCI_EXP_SLTCAP_HPC |
-- FIELD_PREP(PCI_EXP_SLTCAP_PSN, 1);
-+ FIELD_PREP(PCI_EXP_SLTCAP_PSN, 1) |
-+ FIELD_PREP(PCI_EXP_SLTCAP_SPLV, pcie->slot_power_limit_value) |
-+ FIELD_PREP(PCI_EXP_SLTCAP_SPLS, pcie->slot_power_limit_scale);
- bridge->pcie_conf.slotcap = cpu_to_le32(slotcap);
- bridge->pcie_conf.slotsta = cpu_to_le16(PCI_EXP_SLTSTA_PDS);
-
-@@ -1854,6 +1888,7 @@ static int advk_pcie_probe(struct platform_device *pdev)
- struct advk_pcie *pcie;
- struct pci_host_bridge *bridge;
- struct resource_entry *entry;
-+ u32 slot_power_limit;
- int ret, irq;
-
- bridge = devm_pci_alloc_host_bridge(dev, sizeof(struct advk_pcie));
-@@ -1974,6 +2009,14 @@ static int advk_pcie_probe(struct platform_device *pdev)
- else
- pcie->link_gen = ret;
-
-+ slot_power_limit = of_pci_get_slot_power_limit(dev->of_node,
-+ &pcie->slot_power_limit_value,
-+ &pcie->slot_power_limit_scale);
-+ if (slot_power_limit)
-+ dev_info(dev, "Slot Power Limit: %u.%uW\n",
-+ slot_power_limit / 1000,
-+ (slot_power_limit / 100) % 10);
-+
- ret = advk_pcie_setup_phy(pcie);
- if (ret)
- return ret;
---
-2.37.2
-