All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: Jesse Barnes <jbarnes@virtuousgeek.org>,
	Len Brown <lenb@kernel.org>,
	ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
	linux-pm@lists.linux-foundation.org, linux-pci@vger.kernel.org,
	Matthew Garrett <mjg59@srcf.ucam.org>,
	Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
Subject: [PATCH 2/6] ACPI/PCI: do not preserve query result
Date: Fri, 30 Jul 2010 15:21:15 +0900	[thread overview]
Message-ID: <4C526F5B.2050202@jp.fujitsu.com> (raw)
In-Reply-To: <4C526E3E.3000600@jp.fujitsu.com>

Currently, all the _OSC controls are queried at the same time in
acpi_pci_osc_support() and the result is preserved for later
acpi_pci_osc_control_set() call. But query result can vary depending
on the combination of requested controls. Therefore, query result must
not be preserved.

Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>

---
 drivers/acpi/pci_root.c |   49 ++++++++++++++++++++++++++----------------------
 include/acpi/acpi_bus.h |    3 --
 2 files changed, 27 insertions(+), 25 deletions(-)

Index: linux-2.6.35-rc6/drivers/acpi/pci_root.c
===================================================================
--- linux-2.6.35-rc6.orig/drivers/acpi/pci_root.c
+++ linux-2.6.35-rc6/drivers/acpi/pci_root.c
@@ -230,35 +230,42 @@ static acpi_status acpi_pci_run_osc(acpi
 	return status;
 }
 
-static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, u32 flags)
+static acpi_status acpi_pci_osc_control_query(struct acpi_pci_root *root,
+					      u32 flags, u32 *result)
 {
-	acpi_status status;
-	u32 result;
-
-	/* do _OSC query for all possible controls */
-	flags &= OSC_PCI_SUPPORT_MASKS;
-	status = acpi_pci_run_osc(root->device->handle,
-				  root->osc_support_set | flags,
-				  OSC_PCI_CONTROL_MASKS,
-				  true, &result);
-	if (ACPI_SUCCESS(status)) {
-		root->osc_support_set |= flags;
-		root->osc_control_qry = result;
-		root->osc_queried = 1;
+	/* No need to run _OSC if requested control bits are already granted */
+	flags &= OSC_PCI_CONTROL_MASKS;
+	if ((root->osc_control_set & flags) == flags) {
+		*result = root->osc_control_set;
+		return AE_OK;
 	}
-	return status;
+	return acpi_pci_run_osc(root->device->handle,
+				root->osc_support_set,
+				root->osc_control_set | flags,
+				true, result);
 }
 
 static acpi_status acpi_pci_osc_support(struct acpi_pci_root *root, u32 flags)
 {
 	acpi_status status;
 	acpi_handle tmp;
+	u32 result;
 
 	status = acpi_get_handle(root->device->handle, "_OSC", &tmp);
 	if (ACPI_FAILURE(status))
 		return status;
 	mutex_lock(&osc_lock);
-	status = acpi_pci_query_osc(root, flags);
+	/* No need to run _OSC if requested support bits are already set */
+	flags &= OSC_PCI_SUPPORT_MASKS;
+	if ((root->osc_support_set & flags) == flags)
+		goto out;
+	status = acpi_pci_run_osc(root->device->handle,
+				  root->osc_support_set | flags,
+				  root->osc_control_set,
+				  true, &result);
+	if (ACPI_SUCCESS(status))
+		root->osc_support_set |= flags;
+out:
 	mutex_unlock(&osc_lock);
 	return status;
 }
@@ -399,12 +406,10 @@ acpi_status acpi_pci_osc_control_set(acp
 		goto out;
 
 	/* Need to query controls first before requesting them */
-	if (!root->osc_queried) {
-		status = acpi_pci_query_osc(root, root->osc_support_set);
-		if (ACPI_FAILURE(status))
-			goto out;
-	}
-	if ((root->osc_control_qry & control_req) != control_req) {
+	status = acpi_pci_osc_control_query(root, control_req, &result);
+	if (ACPI_FAILURE(status))
+		goto out;
+	if ((result & control_req) != control_req) {
 		printk(KERN_DEBUG
 		       "Firmware did not grant requested _OSC control\n");
 		status = AE_SUPPORT;
Index: linux-2.6.35-rc6/include/acpi/acpi_bus.h
===================================================================
--- linux-2.6.35-rc6.orig/include/acpi/acpi_bus.h
+++ linux-2.6.35-rc6/include/acpi/acpi_bus.h
@@ -377,9 +377,6 @@ struct acpi_pci_root {
 
 	u32 osc_support_set;	/* _OSC state of support bits */
 	u32 osc_control_set;	/* _OSC state of control bits */
-	u32 osc_control_qry;	/* the latest _OSC query result */
-
-	u32 osc_queried:1;	/* has _OSC control been queried? */
 };
 
 /* helper */

  parent reply	other threads:[~2010-07-30  6:21 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-28 21:23 [PATCH] PCI / PCIe: Ask BIOS for control of all native services at once (v4) Rafael J. Wysocki
2010-07-28 21:43 ` Jesse Barnes
2010-07-28 21:43 ` Jesse Barnes
2010-07-29  5:03   ` Kenji Kaneshige
2010-07-29 15:45     ` Rafael J. Wysocki
2010-07-30  6:00       ` Kenji Kaneshige
2010-07-30  6:16         ` Kenji Kaneshige
2010-07-30  6:20           ` [PATCH 1/6] ACPI/PCI: cleanup acpi_pci_run_osc Kenji Kaneshige
2010-07-30  6:20           ` Kenji Kaneshige
2010-07-30 12:15             ` Rafael J. Wysocki
2010-07-30 12:15             ` Rafael J. Wysocki
2010-07-30  6:21           ` [PATCH 2/6] ACPI/PCI: do not preserve query result Kenji Kaneshige
2010-07-30  6:21           ` Kenji Kaneshige [this message]
2010-07-30 12:42             ` Rafael J. Wysocki
2010-07-30 12:42             ` Rafael J. Wysocki
2010-07-30  6:22           ` [PATCH 3/6] ACPI/PCI: optimize checks in acpi_pci_osc_control_set() Kenji Kaneshige
2010-07-30 12:42             ` Rafael J. Wysocki
2010-07-30 12:42             ` Rafael J. Wysocki
2010-07-30  6:22           ` Kenji Kaneshige
2010-07-30  6:23           ` [PATCH 4/6] ACPI/PCI: ask bios for control of all native services at once Kenji Kaneshige
2010-07-30  6:23           ` Kenji Kaneshige
2010-07-30  8:42             ` Hidetoshi Seto
2010-07-30  8:42             ` Hidetoshi Seto
2010-07-30  8:47               ` [PATCH] portdrv: Don't take control of AER if not required Hidetoshi Seto
2010-07-30  8:47               ` Hidetoshi Seto
2010-07-30 12:46             ` [PATCH 4/6] ACPI/PCI: ask bios for control of all native services at once Rafael J. Wysocki
2010-07-30 12:46             ` Rafael J. Wysocki
2010-07-30  6:24           ` [PATCH 5/6] PCI: portdrv: disable native hot-plug interrupt Kenji Kaneshige
2010-07-30  6:24           ` Kenji Kaneshige
2010-07-30  6:25           ` [PATCH 6/6] PCI: portdrv: remove module_exit Kenji Kaneshige
2010-07-30  6:25           ` Kenji Kaneshige
2010-07-30  6:16         ` [PATCH] PCI / PCIe: Ask BIOS for control of all native services at once (v4) Kenji Kaneshige
2010-07-30 11:50         ` Rafael J. Wysocki
2010-07-30 11:50         ` Rafael J. Wysocki
2010-07-30  6:00       ` Kenji Kaneshige
2010-07-29 15:45     ` Rafael J. Wysocki
2010-07-29  5:03   ` Kenji Kaneshige

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=4C526F5B.2050202@jp.fujitsu.com \
    --to=kaneshige.kenji@jp.fujitsu.com \
    --cc=jbarnes@virtuousgeek.org \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux-pm@lists.linux-foundation.org \
    --cc=mjg59@srcf.ucam.org \
    --cc=rjw@sisk.pl \
    --cc=seto.hidetoshi@jp.fujitsu.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.