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/