From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: MIME-Version: 1.0 In-Reply-To: References: <1331362837-10740-1-git-send-email-yinghai@kernel.org> <1331362837-10740-25-git-send-email-yinghai@kernel.org> Date: Mon, 12 Mar 2012 23:06:42 -0700 Message-ID: Subject: Re: [PATCH v2 24/37] PCI, ACPI: Add pci_root_hp hot removal notification support. From: Yinghai Lu To: Bjorn Helgaas Cc: Jesse Barnes , x86 , Andrew Morton , Linus Torvalds , Greg Kroah-Hartman , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, Len Brown , linux-acpi@vger.kernel.org Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-acpi-owner@vger.kernel.org List-ID: On Mon, Mar 12, 2012 at 8:25 PM, Bjorn Helgaas wrote: > On Sat, Mar 10, 2012 at 12:00 AM, Yinghai Lu wrote: >> Add missing hot_remove support for root device. >> >> How to use it? >> Find out root bus number to acpi root name mapping from dmesg or /sys >> >>  echo "\_SB.PCIB 3" > /proc/acpi/sci/notify >> to remove root bus > > Same comments as before: this is definitely NOT the way users should > use this.  If you want to do that for debugging the ACPI notification > path, fine, but the normal way is for the platform to generate this > notification.  I think the normal way for users to manually remove an > ACPI device should be something like: > >    echo 1 > /sys/devices/LNXSYSTM:00/device:00/PNP0A08:00/remove > > just like we do for PCI devices. notify way looks more like really physical hotadd/remove. pci bus/remove and other is not really, because when you are using /sys, you may still need to hold one reference to bus or device. > >> Signed-off-by: Yinghai Lu >> Cc: Len Brown >> Cc: linux-acpi@vger.kernel.org >> --- >>  drivers/acpi/pci_root_hp.c |   61 ++++++++++++++++++++++++++++++++++++++++++++ >>  1 files changed, 61 insertions(+), 0 deletions(-) >> >> diff --git a/drivers/acpi/pci_root_hp.c b/drivers/acpi/pci_root_hp.c >> index dc11e81..f5585f5 100644 >> --- a/drivers/acpi/pci_root_hp.c >> +++ b/drivers/acpi/pci_root_hp.c >> @@ -73,6 +73,12 @@ static void add_acpi_root_bridge(acpi_handle handle) >>        list_add(&bridge->list, &acpi_root_bridge_list); >>  } >> >> +static void remove_acpi_root_bridge(struct acpi_root_bridge *bridge) >> +{ >> +       list_del(&bridge->list); >> +       kfree(bridge); >> +} >> + >>  struct acpi_root_hp_work { >>        struct work_struct work; >>        acpi_handle handle; >> @@ -142,6 +148,55 @@ static void handle_root_bridge_insertion(acpi_handle handle) >>                printk(KERN_ERR "cannot start bridge\n"); >>  } >> >> +static int acpi_root_evaluate_object(acpi_handle handle, char *cmd, int val) >> +{ >> +       acpi_status status; >> +       struct acpi_object_list arg_list; >> +       union acpi_object arg; >> + >> +       arg_list.count = 1; >> +       arg_list.pointer = &arg; >> +       arg.type = ACPI_TYPE_INTEGER; >> +       arg.integer.value = val; >> + >> +       status = acpi_evaluate_object(handle, cmd, &arg_list, NULL); >> +       if (ACPI_FAILURE(status)) { >> +               printk(KERN_WARNING "%s: %s to %d failed\n", >> +                                __func__, cmd, val); >> +               return -1; >> +       } >> + >> +       return 0; > > This function really has nothing to do with host bridges.  Are you > sure there's no generic function you can use instead? seems not.