]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
PCI: pnv_php: Enable third attention indicator state
authorTimothy Pearson <tpearson@raptorengineering.com>
Tue, 15 Jul 2025 21:39:42 +0000 (16:39 -0500)
committerMadhavan Srinivasan <maddy@linux.ibm.com>
Sat, 26 Jul 2025 07:39:20 +0000 (13:09 +0530)
The PCIe specification allows three attention indicator states, on, off,
and blink.  Enable all three states instead of basic on / off control.

This changes the userspace API (writes to the sysfs "attention" file) to
match the behavior of pciehp.  Here's the comparison of previous and new
indicator behavior:

  Value  Previous   New Behavior
  -----  --------   ------------------------
    0    off        (reserved, so undefined)
    1    on         on
    2    on         blink
    3    on         off

Signed-off-by: Timothy Pearson <tpearson@raptorengineering.com>
[bhelgaas: add specifics of behavior change]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/1210309411.1359866.1752615582001.JavaMail.zimbra@raptorengineeringinc.com
drivers/pci/hotplug/pnv_php.c

index 4f85e7fe29ec2339b7467ea63629411dffdd902c..c5345bff9a5538480e53a079a325556207b91fe8 100644 (file)
@@ -441,10 +441,23 @@ static int pnv_php_get_adapter_state(struct hotplug_slot *slot, u8 *state)
        return ret;
 }
 
+static int pnv_php_get_raw_indicator_status(struct hotplug_slot *slot, u8 *state)
+{
+       struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
+       struct pci_dev *bridge = php_slot->pdev;
+       u16 status;
+
+       pcie_capability_read_word(bridge, PCI_EXP_SLTCTL, &status);
+       *state = (status & (PCI_EXP_SLTCTL_AIC | PCI_EXP_SLTCTL_PIC)) >> 6;
+       return 0;
+}
+
+
 static int pnv_php_get_attention_state(struct hotplug_slot *slot, u8 *state)
 {
        struct pnv_php_slot *php_slot = to_pnv_php_slot(slot);
 
+       pnv_php_get_raw_indicator_status(slot, &php_slot->attention_state);
        *state = php_slot->attention_state;
        return 0;
 }
@@ -462,7 +475,7 @@ static int pnv_php_set_attention_state(struct hotplug_slot *slot, u8 state)
        mask = PCI_EXP_SLTCTL_AIC;
 
        if (state)
-               new = PCI_EXP_SLTCTL_ATTN_IND_ON;
+               new = FIELD_PREP(PCI_EXP_SLTCTL_AIC, state);
        else
                new = PCI_EXP_SLTCTL_ATTN_IND_OFF;