Re: [PATCH v2 22/37] PCI, acpiphp: remove hot-add support of pci host bridge

From: Bjorn Helgaas
Date: Mon Mar 12 2012 - 23:14:23 EST


On Sat, Mar 10, 2012 at 12:00 AM, Yinghai Lu <yinghai@xxxxxxxxxx> wrote:
> It causes confusing.

"causes confusion."

> We may only need acpi hp for pci host bridge.
>
> Split host bridge hot-add support to another file, and keep acpiphp simple.

I think it's a good thing to remove host bridge hotplug from acpiphp;
thanks for doing that.

However, I think you removed it here, but didn't add it elsewhere
until a different patch. That means we can't bisect across this. It
would be better to do the entire move in a single patch.

> Also remove not used res_lock in the struct.
>
> Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx>
> ---
>  drivers/pci/hotplug/acpiphp.h      |    9 +---
>  drivers/pci/hotplug/acpiphp_glue.c |  104 +++++++-----------------------------
>  2 files changed, 21 insertions(+), 92 deletions(-)
>
> diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h
> index 7722108..1a62e7b 100644
> --- a/drivers/pci/hotplug/acpiphp.h
> +++ b/drivers/pci/hotplug/acpiphp.h
> @@ -79,18 +79,15 @@ struct acpiphp_bridge {
>        /* Ejectable PCI-to-PCI bridge (PCI bridge and PCI function) */
>        struct acpiphp_func *func;
>
> -       int type;
>        int nr_slots;
>
>        u32 flags;
>
> -       /* This bus (host bridge) or Secondary bus (PCI-to-PCI bridge) */
> +       /* Secondary bus (PCI-to-PCI bridge) */
>        struct pci_bus *pci_bus;
>
>        /* PCI-to-PCI bridge device */
>        struct pci_dev *pci_dev;
> -
> -       spinlock_t res_lock;
>  };
>
>
> @@ -148,10 +145,6 @@ struct acpiphp_attention_info
>  /* PCI bus bridge HID */
>  #define ACPI_PCI_HOST_HID              "PNP0A03"
>
> -/* PCI BRIDGE type */
> -#define BRIDGE_TYPE_HOST               0
> -#define BRIDGE_TYPE_P2P                        1
> -
>  /* ACPI _STA method value (ignore bit 4; battery present) */
>  #define ACPI_STA_PRESENT               (0x00000001)
>  #define ACPI_STA_ENABLED               (0x00000002)
> diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
> index 10b2122..1ca82ae 100644
> --- a/drivers/pci/hotplug/acpiphp_glue.c
> +++ b/drivers/pci/hotplug/acpiphp_glue.c
> @@ -283,7 +283,7 @@ static int detect_ejectable_slots(acpi_handle handle)
>        return found;
>  }
>
> -/* initialize miscellaneous stuff for both root and PCI-to-PCI bridge */
> +/* initialize miscellaneous stuff for PCI-to-PCI bridge */
>  static void init_bridge_misc(struct acpiphp_bridge *bridge)
>  {
>        acpi_status status;
> @@ -300,25 +300,21 @@ static void init_bridge_misc(struct acpiphp_bridge *bridge)
>        }
>
>        /* install notify handler */
> -       if (bridge->type != BRIDGE_TYPE_HOST) {
> -               if ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func) {
> -                       status = acpi_remove_notify_handler(bridge->func->handle,
> -                                               ACPI_SYSTEM_NOTIFY,
> -                                               handle_hotplug_event_func);
> -                       if (ACPI_FAILURE(status))
> -                               err("failed to remove notify handler\n");
> -               }
> -               status = acpi_install_notify_handler(bridge->handle,
> -                                            ACPI_SYSTEM_NOTIFY,
> -                                            handle_hotplug_event_bridge,
> -                                            bridge);
> -
> -               if (ACPI_FAILURE(status)) {
> -                       err("failed to register interrupt notify handler\n");
> -               }
> +       if ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func) {
> +               status = acpi_remove_notify_handler(bridge->func->handle,
> +                                       ACPI_SYSTEM_NOTIFY,
> +                                       handle_hotplug_event_func);
> +               if (ACPI_FAILURE(status))
> +                       err("failed to remove notify handler\n");
>        }
> -}
> +       status = acpi_install_notify_handler(bridge->handle,
> +                                    ACPI_SYSTEM_NOTIFY,
> +                                    handle_hotplug_event_bridge,
> +                                    bridge);
>
> +       if (ACPI_FAILURE(status))
> +               err("failed to register interrupt notify handler\n");
> +}
>
>  /* find acpiphp_func from acpiphp_bridge */
>  static struct acpiphp_func *acpiphp_bridge_handle_to_function(acpi_handle handle)
> @@ -375,28 +371,6 @@ static inline void config_p2p_bridge_flags(struct acpiphp_bridge *bridge)
>        }
>  }
>
> -
> -/* allocate and initialize host bridge data structure */
> -static void add_host_bridge(acpi_handle *handle)
> -{
> -       struct acpiphp_bridge *bridge;
> -       struct acpi_pci_root *root = acpi_pci_find_root(handle);
> -
> -       bridge = kzalloc(sizeof(struct acpiphp_bridge), GFP_KERNEL);
> -       if (bridge == NULL)
> -               return;
> -
> -       bridge->type = BRIDGE_TYPE_HOST;
> -       bridge->handle = handle;
> -
> -       bridge->pci_bus = root->bus;
> -
> -       spin_lock_init(&bridge->res_lock);
> -
> -       init_bridge_misc(bridge);
> -}
> -
> -
>  /* allocate and initialize PCI-to-PCI bridge data structure */
>  static void add_p2p_bridge(acpi_handle *handle)
>  {
> @@ -408,7 +382,6 @@ static void add_p2p_bridge(acpi_handle *handle)
>                return;
>        }
>
> -       bridge->type = BRIDGE_TYPE_P2P;
>        bridge->handle = handle;
>        config_p2p_bridge_flags(bridge);
>
> @@ -425,7 +398,6 @@ static void add_p2p_bridge(acpi_handle *handle)
>         * (which we access during module unload).
>         */
>        get_device(&bridge->pci_bus->dev);
> -       spin_lock_init(&bridge->res_lock);
>
>        init_bridge_misc(bridge);
>        return;
> @@ -485,12 +457,6 @@ static int add_bridge(acpi_handle handle)
>                        return 0;
>        }
>
> -       /* check if this bridge has ejectable slots */
> -       if (detect_ejectable_slots(handle) > 0) {
> -               dbg("found PCI host-bus bridge with hot-pluggable slots\n");
> -               add_host_bridge(handle);
> -       }
> -
>        /* search P2P bridges under this host bridge */
>        status = acpi_walk_namespace(ACPI_TYPE_DEVICE, handle, (u32)1,
>                                     find_p2p_bridge, NULL, NULL, NULL);
> @@ -524,8 +490,7 @@ static void cleanup_bridge(struct acpiphp_bridge *bridge)
>        if (ACPI_FAILURE(status))
>                err("failed to remove notify handler\n");
>
> -       if ((bridge->type != BRIDGE_TYPE_HOST) &&
> -           ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func)) {
> +       if ((bridge->flags & BRIDGE_HAS_EJ0) && bridge->func) {
>                status = acpi_install_notify_handler(bridge->func->handle,
>                                                ACPI_SYSTEM_NOTIFY,
>                                                handle_hotplug_event_func,
> @@ -1078,15 +1043,10 @@ static void acpiphp_sanitize_bus(struct pci_bus *bus)
>  static int acpiphp_configure_bridge (acpi_handle handle)
>  {
>        struct pci_bus *bus;
> +       struct pci_dev *pdev = acpi_get_pci_dev(handle);
>
> -       if (acpi_is_root_bridge(handle)) {
> -               struct acpi_pci_root *root = acpi_pci_find_root(handle);
> -               bus = root->bus;
> -       } else {
> -               struct pci_dev *pdev = acpi_get_pci_dev(handle);
> -               bus = pdev->subordinate;
> -               pci_dev_put(pdev);
> -       }
> +       bus = pdev->subordinate;
> +       pci_dev_put(pdev);
>
>        pci_bus_size_bridges(bus);
>        pci_bus_assign_resources(bus);
> @@ -1249,8 +1209,7 @@ static void _handle_hotplug_event_bridge(struct work_struct *work)
>        case ACPI_NOTIFY_EJECT_REQUEST:
>                /* request device eject */
>                dbg("%s: Device eject notify on %s\n", __func__, objname);
> -               if ((bridge->type != BRIDGE_TYPE_HOST) &&
> -                   (bridge->flags & BRIDGE_HAS_EJ0)) {
> +               if (bridge->flags & BRIDGE_HAS_EJ0) {
>                        struct acpiphp_slot *slot;
>                        slot = bridge->func->slot;
>                        if (!acpiphp_disable_slot(slot))
> @@ -1381,21 +1340,6 @@ static void handle_hotplug_event_func(acpi_handle handle, u32 type,
>                              _handle_hotplug_event_func);
>  }
>
> -static acpi_status
> -find_root_bridges(acpi_handle handle, u32 lvl, void *context, void **rv)
> -{
> -       int *count = (int *)context;
> -
> -       if (!acpi_is_root_bridge(handle))
> -               return AE_OK;
> -
> -       (*count)++;
> -       acpi_install_notify_handler(handle, ACPI_SYSTEM_NOTIFY,
> -                                   handle_hotplug_event_bridge, NULL);
> -
> -       return AE_OK ;
> -}
> -
>  static struct acpi_pci_driver acpi_pci_hp_driver = {
>        .add =          add_bridge,
>        .remove =       remove_bridge,
> @@ -1406,15 +1350,7 @@ static struct acpi_pci_driver acpi_pci_hp_driver = {
>  */
>  int __init acpiphp_glue_init(void)
>  {
> -       int num = 0;
> -
> -       acpi_walk_namespace(ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
> -                       ACPI_UINT32_MAX, find_root_bridges, NULL, &num, NULL);
> -
> -       if (num <= 0)
> -               return -1;
> -       else
> -               acpi_pci_register_driver(&acpi_pci_hp_driver);
> +       acpi_pci_register_driver(&acpi_pci_hp_driver);
>
>        return 0;
>  }
> --
> 1.7.7
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/