linux/drivers/pci/hotplug/acpiphp.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * ACPI PCI Hot Plug Controller Driver
   4 *
   5 * Copyright (C) 1995,2001 Compaq Computer Corporation
   6 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
   7 * Copyright (C) 2001 IBM Corp.
   8 * Copyright (C) 2002 Hiroshi Aono (h-aono@ap.jp.nec.com)
   9 * Copyright (C) 2002,2003 Takayoshi Kochi (t-kochi@bq.jp.nec.com)
  10 * Copyright (C) 2002,2003 NEC Corporation
  11 * Copyright (C) 2003-2005 Matthew Wilcox (willy@infradead.org)
  12 * Copyright (C) 2003-2005 Hewlett Packard
  13 *
  14 * All rights reserved.
  15 *
  16 * Send feedback to <gregkh@us.ibm.com>,
  17 *                  <t-kochi@bq.jp.nec.com>
  18 *
  19 */
  20
  21#ifndef _ACPIPHP_H
  22#define _ACPIPHP_H
  23
  24#include <linux/acpi.h>
  25#include <linux/mutex.h>
  26#include <linux/pci_hotplug.h>
  27
  28struct acpiphp_context;
  29struct acpiphp_bridge;
  30struct acpiphp_slot;
  31
  32/*
  33 * struct slot - slot information for each *physical* slot
  34 */
  35struct slot {
  36        struct hotplug_slot     hotplug_slot;
  37        struct acpiphp_slot     *acpi_slot;
  38        unsigned int sun;       /* ACPI _SUN (Slot User Number) value */
  39};
  40
  41static inline const char *slot_name(struct slot *slot)
  42{
  43        return hotplug_slot_name(&slot->hotplug_slot);
  44}
  45
  46static inline struct slot *to_slot(struct hotplug_slot *hotplug_slot)
  47{
  48        return container_of(hotplug_slot, struct slot, hotplug_slot);
  49}
  50
  51/*
  52 * struct acpiphp_bridge - PCI bridge information
  53 *
  54 * for each bridge device in ACPI namespace
  55 */
  56struct acpiphp_bridge {
  57        struct list_head list;
  58        struct list_head slots;
  59        struct kref ref;
  60
  61        struct acpiphp_context *context;
  62
  63        int nr_slots;
  64
  65        /* This bus (host bridge) or Secondary bus (PCI-to-PCI bridge) */
  66        struct pci_bus *pci_bus;
  67
  68        /* PCI-to-PCI bridge device */
  69        struct pci_dev *pci_dev;
  70
  71        bool is_going_away;
  72};
  73
  74
  75/*
  76 * struct acpiphp_slot - PCI slot information
  77 *
  78 * PCI slot information for each *physical* PCI slot
  79 */
  80struct acpiphp_slot {
  81        struct list_head node;
  82        struct pci_bus *bus;
  83        struct list_head funcs;         /* one slot may have different
  84                                           objects (i.e. for each function) */
  85        struct slot *slot;
  86
  87        u8              device;         /* pci device# */
  88        u32             flags;          /* see below */
  89};
  90
  91
  92/*
  93 * struct acpiphp_func - PCI function information
  94 *
  95 * PCI function information for each object in ACPI namespace
  96 * typically 8 objects per slot (i.e. for each PCI function)
  97 */
  98struct acpiphp_func {
  99        struct acpiphp_bridge *parent;
 100        struct acpiphp_slot *slot;
 101
 102        struct list_head sibling;
 103
 104        u8              function;       /* pci function# */
 105        u32             flags;          /* see below */
 106};
 107
 108struct acpiphp_context {
 109        struct acpi_hotplug_context hp;
 110        struct acpiphp_func func;
 111        struct acpiphp_bridge *bridge;
 112        unsigned int refcount;
 113};
 114
 115static inline struct acpiphp_context *to_acpiphp_context(struct acpi_hotplug_context *hp)
 116{
 117        return container_of(hp, struct acpiphp_context, hp);
 118}
 119
 120static inline struct acpiphp_context *func_to_context(struct acpiphp_func *func)
 121{
 122        return container_of(func, struct acpiphp_context, func);
 123}
 124
 125static inline struct acpi_device *func_to_acpi_device(struct acpiphp_func *func)
 126{
 127        return func_to_context(func)->hp.self;
 128}
 129
 130static inline acpi_handle func_to_handle(struct acpiphp_func *func)
 131{
 132        return func_to_acpi_device(func)->handle;
 133}
 134
 135struct acpiphp_root_context {
 136        struct acpi_hotplug_context hp;
 137        struct acpiphp_bridge *root_bridge;
 138};
 139
 140static inline struct acpiphp_root_context *to_acpiphp_root_context(struct acpi_hotplug_context *hp)
 141{
 142        return container_of(hp, struct acpiphp_root_context, hp);
 143}
 144
 145/*
 146 * struct acpiphp_attention_info - device specific attention registration
 147 *
 148 * ACPI has no generic method of setting/getting attention status
 149 * this allows for device specific driver registration
 150 */
 151struct acpiphp_attention_info
 152{
 153        int (*set_attn)(struct hotplug_slot *slot, u8 status);
 154        int (*get_attn)(struct hotplug_slot *slot, u8 *status);
 155        struct module *owner;
 156};
 157
 158/* ACPI _STA method value (ignore bit 4; battery present) */
 159#define ACPI_STA_ALL                    (0x0000000f)
 160
 161/* slot flags */
 162
 163#define SLOT_ENABLED            (0x00000001)
 164#define SLOT_IS_GOING_AWAY      (0x00000002)
 165
 166/* function flags */
 167
 168#define FUNC_HAS_STA            (0x00000001)
 169#define FUNC_HAS_EJ0            (0x00000002)
 170
 171/* function prototypes */
 172
 173/* acpiphp_core.c */
 174int acpiphp_register_attention(struct acpiphp_attention_info *info);
 175int acpiphp_unregister_attention(struct acpiphp_attention_info *info);
 176int acpiphp_register_hotplug_slot(struct acpiphp_slot *slot, unsigned int sun);
 177void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *slot);
 178
 179/* acpiphp_glue.c */
 180typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data);
 181
 182int acpiphp_enable_slot(struct acpiphp_slot *slot);
 183int acpiphp_disable_slot(struct acpiphp_slot *slot);
 184u8 acpiphp_get_power_status(struct acpiphp_slot *slot);
 185u8 acpiphp_get_attention_status(struct acpiphp_slot *slot);
 186u8 acpiphp_get_latch_status(struct acpiphp_slot *slot);
 187u8 acpiphp_get_adapter_status(struct acpiphp_slot *slot);
 188
 189/* variables */
 190extern bool acpiphp_disabled;
 191
 192#endif /* _ACPIPHP_H */
 193