From: Grant Grundler <grundler@parisc-linux.org>
To: Matthew Garrett <mjg59@srcf.ucam.org>
Cc: linux-pci@vger.kernel.org, kristen.c.accardi@intel.com,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH] Add option to passively listen for PCIE hotplug events
Date: Sat, 1 Nov 2008 11:51:52 -0600 [thread overview]
Message-ID: <20081101175152.GG13302@colo.lackof.org> (raw)
In-Reply-To: <20081029200903.GA1678@srcf.ucam.org>
On Wed, Oct 29, 2008 at 08:09:03PM +0000, Matthew Garrett wrote:
> Various pieces of hardware (such as the Acer Aspire One and Asus EEE)
> use PCIE hotplug to change the state of devices in response to events
> such as the removal of SD cards or disabling the wireless radio.
> However, they do not provide firmware support for this. As a consequence
> pciehp will refuse to load and various things break.
>
> The existing workaround has been to use the pciehp_force option. This is
> undesirable as there is little guarantee that manipulating the power
> file in the slot directory will actually result in anything happening,
> leading to potential user confusion and hardware damage. This patch adds
> a new option, pciehp_passive. In this configuration pciehp will listen
> for events and notify the PCI core appropriately. However, it will not
> provide any user controllable sysfs attributes and so the risk of
> confusion or damage is averted. Any system slots that do have firmware
> support will continue to provide full functionality.
>
> Signed-off-by: Matthew Garrett <mjg@redhat.com>
Can you add something to Documentation/ for this new option?
Either kernel-parameters.txt or something in PCI/ seems appropriate.
Just cutting/pasting the above would be good enough for me.
thanks,
grant
>
> ---
>
> diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
> index 4b23bc3..b878432 100644
> --- a/drivers/pci/hotplug/pciehp_core.c
> +++ b/drivers/pci/hotplug/pciehp_core.c
> @@ -41,6 +41,7 @@ int pciehp_debug;
> int pciehp_poll_mode;
> int pciehp_poll_time;
> int pciehp_force;
> +int pciehp_passive;
> struct workqueue_struct *pciehp_wq;
>
> #define DRIVER_VERSION "0.4"
> @@ -55,10 +56,12 @@ module_param(pciehp_debug, bool, 0644);
> module_param(pciehp_poll_mode, bool, 0644);
> module_param(pciehp_poll_time, int, 0644);
> module_param(pciehp_force, bool, 0644);
> +module_param(pciehp_passive, bool, 0644);
> MODULE_PARM_DESC(pciehp_debug, "Debugging mode enabled or not");
> MODULE_PARM_DESC(pciehp_poll_mode, "Using polling mechanism for hot-plug events or not");
> MODULE_PARM_DESC(pciehp_poll_time, "Polling mechanism frequency, in seconds");
> MODULE_PARM_DESC(pciehp_force, "Force pciehp, even if _OSC and OSHP are missing");
> +MODULE_PARM_DESC(pciehp_passive, "Listen for pciehp events, even if _OSC and OSHP are missing");
>
> #define PCIE_MODULE_NAME "pciehp"
>
> @@ -85,6 +88,13 @@ static struct hotplug_slot_ops pciehp_hotplug_slot_ops = {
> .get_cur_bus_speed = get_cur_bus_speed,
> };
>
> +static struct hotplug_slot_ops pciehp_passive_hotplug_slot_ops = {
> + .owner = THIS_MODULE,
> + .get_adapter_status = get_adapter_status,
> + .get_max_bus_speed = get_max_bus_speed,
> + .get_cur_bus_speed = get_cur_bus_speed,
> +};
> +
> /*
> * Check the status of the Electro Mechanical Interlock (EMI)
> */
> @@ -212,7 +222,11 @@ static int init_slots(struct controller *ctrl)
> hotplug_slot->info = info;
> hotplug_slot->private = slot;
> hotplug_slot->release = &release_slot;
> - hotplug_slot->ops = &pciehp_hotplug_slot_ops;
> + if (pciehp_passive &&
> + pciehp_get_hp_hw_control_from_firmware(ctrl->pci_dev))
> + hotplug_slot->ops = &pciehp_passive_hotplug_slot_ops;
> + else
> + hotplug_slot->ops = &pciehp_hotplug_slot_ops;
> slot->hotplug_slot = hotplug_slot;
> snprintf(name, SLOT_NAME_SIZE, "%u", slot->number);
>
> @@ -407,7 +421,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
> u8 value;
> struct pci_dev *pdev = dev->port;
>
> - if (pciehp_force)
> + if (pciehp_force || pciehp_passive)
> dev_info(&dev->device,
> "Bypassing BIOS check for pciehp use on %s\n",
> pci_name(pdev));
> @@ -435,7 +449,7 @@ static int pciehp_probe(struct pcie_device *dev, const struct pcie_port_service_
> t_slot = pciehp_find_slot(ctrl, ctrl->slot_device_offset);
>
> t_slot->hpc_ops->get_adapter_status(t_slot, &value); /* Check if slot is occupied */
> - if (value && pciehp_force) {
> + if (value && (pciehp_force || pciehp_passive)) {
> rc = pciehp_enable_slot(t_slot);
> if (rc) /* -ENODEV: shouldn't happen, but deal with it */
> value = 0;
> @@ -474,7 +488,7 @@ static int pciehp_suspend (struct pcie_device *dev, pm_message_t state)
> static int pciehp_resume (struct pcie_device *dev)
> {
> dev_info(&dev->device, "%s ENTRY\n", __func__);
> - if (pciehp_force) {
> + if (pciehp_force || pciehp_passive) {
> struct controller *ctrl = get_service_data(dev);
> struct slot *t_slot;
> u8 status;
>
> --
> Matthew Garrett | mjg59@srcf.ucam.org
> --
> To unsubscribe from this list: send the line "unsubscribe linux-pci" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2008-11-01 17:52 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-29 20:09 [PATCH] Add option to passively listen for PCIE hotplug events Matthew Garrett
2008-11-01 17:51 ` Grant Grundler [this message]
2008-11-03 13:26 ` [PATCH v2] " Matthew Garrett
2008-11-03 13:43 ` Fabio Comolli
2008-11-03 13:46 ` Matthew Garrett
2008-11-14 16:56 ` Randy Dunlap
2008-11-14 17:00 ` Matthew Garrett
2008-11-03 22:23 ` [PATCH] " Andrew Morton
2008-11-03 22:30 ` Matthew Garrett
2008-11-04 1:58 ` Kenji Kaneshige
2008-11-04 2:07 ` Matthew Garrett
2008-11-04 2:29 ` Kenji Kaneshige
2008-11-04 2:38 ` Matthew Garrett
2008-11-04 3:11 ` Kenji Kaneshige
2008-11-04 5:02 ` Matthew Garrett
2008-11-04 5:46 ` Kenji Kaneshige
2008-11-04 12:45 ` Matthew Garrett
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20081101175152.GG13302@colo.lackof.org \
--to=grundler@parisc-linux.org \
--cc=kristen.c.accardi@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=mjg59@srcf.ucam.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox