112 lines · c
1/* SPDX-License-Identifier: GPL-2.0+ */2/*3 * PCI HotPlug Core Functions4 *5 * Copyright (C) 1995,2001 Compaq Computer Corporation6 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)7 * Copyright (C) 2001 IBM Corp.8 *9 * All rights reserved.10 *11 * Send feedback to <kristen.c.accardi@intel.com>12 *13 */14#ifndef _PCI_HOTPLUG_H15#define _PCI_HOTPLUG_H16 17/**18 * struct hotplug_slot_ops -the callbacks that the hotplug pci core can use19 * @enable_slot: Called when the user wants to enable a specific pci slot20 * @disable_slot: Called when the user wants to disable a specific pci slot21 * @set_attention_status: Called to set the specific slot's attention LED to22 * the specified value23 * @hardware_test: Called to run a specified hardware test on the specified24 * slot.25 * @get_power_status: Called to get the current power status of a slot.26 * @get_attention_status: Called to get the current attention status of a slot.27 * @get_latch_status: Called to get the current latch status of a slot.28 * @get_adapter_status: Called to get see if an adapter is present in the slot or not.29 * @reset_slot: Optional interface to allow override of a bus reset for the30 * slot for cases where a secondary bus reset can result in spurious31 * hotplug events or where a slot can be reset independent of the bus.32 *33 * The table of function pointers that is passed to the hotplug pci core by a34 * hotplug pci driver. These functions are called by the hotplug pci core when35 * the user wants to do something to a specific slot (query it for information,36 * set an LED, enable / disable power, etc.)37 */38struct hotplug_slot_ops {39 int (*enable_slot) (struct hotplug_slot *slot);40 int (*disable_slot) (struct hotplug_slot *slot);41 int (*set_attention_status) (struct hotplug_slot *slot, u8 value);42 int (*hardware_test) (struct hotplug_slot *slot, u32 value);43 int (*get_power_status) (struct hotplug_slot *slot, u8 *value);44 int (*get_attention_status) (struct hotplug_slot *slot, u8 *value);45 int (*get_latch_status) (struct hotplug_slot *slot, u8 *value);46 int (*get_adapter_status) (struct hotplug_slot *slot, u8 *value);47 int (*reset_slot) (struct hotplug_slot *slot, bool probe);48};49 50/**51 * struct hotplug_slot - used to register a physical slot with the hotplug pci core52 * @ops: pointer to the &struct hotplug_slot_ops to be used for this slot53 * @slot_list: internal list used to track hotplug PCI slots54 * @pci_slot: represents a physical slot55 * @owner: The module owner of this structure56 * @mod_name: The module name (KBUILD_MODNAME) of this structure57 */58struct hotplug_slot {59 const struct hotplug_slot_ops *ops;60 61 /* Variables below this are for use only by the hotplug pci core. */62 struct list_head slot_list;63 struct pci_slot *pci_slot;64 struct module *owner;65 const char *mod_name;66};67 68static inline const char *hotplug_slot_name(const struct hotplug_slot *slot)69{70 return pci_slot_name(slot->pci_slot);71}72 73int __pci_hp_register(struct hotplug_slot *slot, struct pci_bus *pbus, int nr,74 const char *name, struct module *owner,75 const char *mod_name);76int __pci_hp_initialize(struct hotplug_slot *slot, struct pci_bus *bus, int nr,77 const char *name, struct module *owner,78 const char *mod_name);79int pci_hp_add(struct hotplug_slot *slot);80 81void pci_hp_del(struct hotplug_slot *slot);82void pci_hp_destroy(struct hotplug_slot *slot);83void pci_hp_deregister(struct hotplug_slot *slot);84 85/* use a define to avoid include chaining to get THIS_MODULE & friends */86#define pci_hp_register(slot, pbus, devnr, name) \87 __pci_hp_register(slot, pbus, devnr, name, THIS_MODULE, KBUILD_MODNAME)88#define pci_hp_initialize(slot, bus, nr, name) \89 __pci_hp_initialize(slot, bus, nr, name, THIS_MODULE, KBUILD_MODNAME)90 91#ifdef CONFIG_ACPI92#include <linux/acpi.h>93bool pciehp_is_native(struct pci_dev *bridge);94int acpi_get_hp_hw_control_from_firmware(struct pci_dev *bridge);95bool shpchp_is_native(struct pci_dev *bridge);96int acpi_pci_check_ejectable(struct pci_bus *pbus, acpi_handle handle);97int acpi_pci_detect_ejectable(acpi_handle handle);98#else99static inline int acpi_get_hp_hw_control_from_firmware(struct pci_dev *bridge)100{101 return 0;102}103static inline bool pciehp_is_native(struct pci_dev *bridge) { return true; }104static inline bool shpchp_is_native(struct pci_dev *bridge) { return true; }105#endif106 107static inline bool hotplug_is_native(struct pci_dev *bridge)108{109 return pciehp_is_native(bridge) || shpchp_is_native(bridge);110}111#endif112