diff --git a/patches/kernel/0020-PCI-pciehp-Retain-Power-Indicator-bits-for-userspace.patch b/patches/kernel/0020-PCI-pciehp-Retain-Power-Indicator-bits-for-userspace.patch new file mode 100644 index 0000000..7f29e5c --- /dev/null +++ b/patches/kernel/0020-PCI-pciehp-Retain-Power-Indicator-bits-for-userspace.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Blazej Kucman +Date: Mon, 22 Jul 2024 16:14:40 +0200 +Subject: [PATCH] PCI: pciehp: Retain Power Indicator bits for userspace + indicators + +The sysfs "attention" file normally controls the Slot Control Attention +Indicator with 0 (off), 1 (on), 2 (blink) settings. + +576243b3f9ea ("PCI: pciehp: Allow exclusive userspace control of +indicators") added pciehp_set_raw_indicator_status() to allow userspace to +directly control all four bits in both the Attention Indicator and the +Power Indicator fields via the "attention" file. + +This is used on Intel VMD bridges so utilities like "ledmon" can use sysfs +"attention" to control up to 16 indicators for NVMe device RAID status. + +abaaac4845a0 ("PCI: hotplug: Use FIELD_GET/PREP()") broke this by masking +the sysfs data with PCI_EXP_SLTCTL_AIC, which discards the upper two bits +intended for the Power Indicator Control field (PCI_EXP_SLTCTL_PIC). + +For NVMe devices behind an Intel VMD, ledmon settings that use the +PCI_EXP_SLTCTL_PIC bits, i.e., ATTENTION_REBUILD (0x5), ATTENTION_LOCATE +(0x7), ATTENTION_FAILURE (0xD), ATTENTION_OFF (0xF), no longer worked +correctly. + +Mask with PCI_EXP_SLTCTL_AIC | PCI_EXP_SLTCTL_PIC to retain both the +Attention Indicator and the Power Indicator bits. + +Fixes: abaaac4845a0 ("PCI: hotplug: Use FIELD_GET/PREP()") +Link: https://lore.kernel.org/r/20240722141440.7210-1-blazej.kucman@intel.com +Signed-off-by: Blazej Kucman +[bhelgaas: commit log] +Signed-off-by: Bjorn Helgaas +Cc: stable@vger.kernel.org # v6.7+ +--- + drivers/pci/hotplug/pciehp_hpc.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c +index b1d0a1b3917d..9d3c249207c4 100644 +--- a/drivers/pci/hotplug/pciehp_hpc.c ++++ b/drivers/pci/hotplug/pciehp_hpc.c +@@ -485,7 +485,9 @@ int pciehp_set_raw_indicator_status(struct hotplug_slot *hotplug_slot, + struct pci_dev *pdev = ctrl_dev(ctrl); + + pci_config_pm_runtime_get(pdev); +- pcie_write_cmd_nowait(ctrl, FIELD_PREP(PCI_EXP_SLTCTL_AIC, status), ++ ++ /* Attention and Power Indicator Control bits are supported */ ++ pcie_write_cmd_nowait(ctrl, FIELD_PREP(PCI_EXP_SLTCTL_AIC | PCI_EXP_SLTCTL_PIC, status), + PCI_EXP_SLTCTL_AIC | PCI_EXP_SLTCTL_PIC); + pci_config_pm_runtime_put(pdev); + return 0;