Merge branch 'pci/hotplug'

- Simplify Attention Button logging (Bjorn Helgaas)

- Cancel bringup sequence if card is not present, to keep from blinking
  Power Indicator indefinitely (Rongguang Wei)

- Reassign bridge resources if necessary for ACPI hotplug (Igor Mammedov)

* pci/hotplug:
  PCI: acpiphp: Reassign resources on bridge if necessary
  PCI: pciehp: Cancel bringup sequence if card is not present
  PCI: pciehp: Simplify Attention Button logging
This commit is contained in:
Bjorn Helgaas 2023-06-26 12:59:56 -05:00
commit db5ccb2eda
3 changed files with 17 additions and 14 deletions

View File

@ -498,7 +498,6 @@ static void enable_slot(struct acpiphp_slot *slot, bool bridge)
acpiphp_native_scan_bridge(dev); acpiphp_native_scan_bridge(dev);
} }
} else { } else {
LIST_HEAD(add_list);
int max, pass; int max, pass;
acpiphp_rescan_slot(slot); acpiphp_rescan_slot(slot);
@ -512,12 +511,10 @@ static void enable_slot(struct acpiphp_slot *slot, bool bridge)
if (pass && dev->subordinate) { if (pass && dev->subordinate) {
check_hotplug_bridge(slot, dev); check_hotplug_bridge(slot, dev);
pcibios_resource_survey_bus(dev->subordinate); pcibios_resource_survey_bus(dev->subordinate);
__pci_bus_size_bridges(dev->subordinate,
&add_list);
} }
} }
} }
__pci_bus_assign_resources(bus, &add_list, NULL); pci_assign_unassigned_bridge_resources(bus->self);
} }
acpiphp_sanitize_bus(bus); acpiphp_sanitize_bus(bus);

View File

@ -166,11 +166,11 @@ void pciehp_handle_button_press(struct controller *ctrl)
case ON_STATE: case ON_STATE:
if (ctrl->state == ON_STATE) { if (ctrl->state == ON_STATE) {
ctrl->state = BLINKINGOFF_STATE; ctrl->state = BLINKINGOFF_STATE;
ctrl_info(ctrl, "Slot(%s): Powering off due to button press\n", ctrl_info(ctrl, "Slot(%s): Button press: will power off in 5 sec\n",
slot_name(ctrl)); slot_name(ctrl));
} else { } else {
ctrl->state = BLINKINGON_STATE; ctrl->state = BLINKINGON_STATE;
ctrl_info(ctrl, "Slot(%s) Powering on due to button press\n", ctrl_info(ctrl, "Slot(%s): Button press: will power on in 5 sec\n",
slot_name(ctrl)); slot_name(ctrl));
} }
/* blink power indicator and turn off attention */ /* blink power indicator and turn off attention */
@ -185,22 +185,23 @@ void pciehp_handle_button_press(struct controller *ctrl)
* press the attention again before the 5 sec. limit * press the attention again before the 5 sec. limit
* expires to cancel hot-add or hot-remove * expires to cancel hot-add or hot-remove
*/ */
ctrl_info(ctrl, "Slot(%s): Button cancel\n", slot_name(ctrl));
cancel_delayed_work(&ctrl->button_work); cancel_delayed_work(&ctrl->button_work);
if (ctrl->state == BLINKINGOFF_STATE) { if (ctrl->state == BLINKINGOFF_STATE) {
ctrl->state = ON_STATE; ctrl->state = ON_STATE;
pciehp_set_indicators(ctrl, PCI_EXP_SLTCTL_PWR_IND_ON, pciehp_set_indicators(ctrl, PCI_EXP_SLTCTL_PWR_IND_ON,
PCI_EXP_SLTCTL_ATTN_IND_OFF); PCI_EXP_SLTCTL_ATTN_IND_OFF);
ctrl_info(ctrl, "Slot(%s): Button press: canceling request to power off\n",
slot_name(ctrl));
} else { } else {
ctrl->state = OFF_STATE; ctrl->state = OFF_STATE;
pciehp_set_indicators(ctrl, PCI_EXP_SLTCTL_PWR_IND_OFF, pciehp_set_indicators(ctrl, PCI_EXP_SLTCTL_PWR_IND_OFF,
PCI_EXP_SLTCTL_ATTN_IND_OFF); PCI_EXP_SLTCTL_ATTN_IND_OFF);
ctrl_info(ctrl, "Slot(%s): Button press: canceling request to power on\n",
slot_name(ctrl));
} }
ctrl_info(ctrl, "Slot(%s): Action canceled due to button press\n",
slot_name(ctrl));
break; break;
default: default:
ctrl_err(ctrl, "Slot(%s): Ignoring invalid state %#x\n", ctrl_err(ctrl, "Slot(%s): Button press: ignoring invalid state %#x\n",
slot_name(ctrl), ctrl->state); slot_name(ctrl), ctrl->state);
break; break;
} }
@ -256,6 +257,14 @@ void pciehp_handle_presence_or_link_change(struct controller *ctrl, u32 events)
present = pciehp_card_present(ctrl); present = pciehp_card_present(ctrl);
link_active = pciehp_check_link_active(ctrl); link_active = pciehp_check_link_active(ctrl);
if (present <= 0 && link_active <= 0) { if (present <= 0 && link_active <= 0) {
if (ctrl->state == BLINKINGON_STATE) {
ctrl->state = OFF_STATE;
cancel_delayed_work(&ctrl->button_work);
pciehp_set_indicators(ctrl, PCI_EXP_SLTCTL_PWR_IND_OFF,
INDICATOR_NOOP);
ctrl_info(ctrl, "Slot(%s): Card not present\n",
slot_name(ctrl));
}
mutex_unlock(&ctrl->state_lock); mutex_unlock(&ctrl->state_lock);
return; return;
} }

View File

@ -722,11 +722,8 @@ static irqreturn_t pciehp_ist(int irq, void *dev_id)
} }
/* Check Attention Button Pressed */ /* Check Attention Button Pressed */
if (events & PCI_EXP_SLTSTA_ABP) { if (events & PCI_EXP_SLTSTA_ABP)
ctrl_info(ctrl, "Slot(%s): Attention button pressed\n",
slot_name(ctrl));
pciehp_handle_button_press(ctrl); pciehp_handle_button_press(ctrl);
}
/* Check Power Fault Detected */ /* Check Power Fault Detected */
if (events & PCI_EXP_SLTSTA_PFD) { if (events & PCI_EXP_SLTSTA_PFD) {