mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Lv Zheng <lv.zheng@intel.com>
To: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>,
	"Rafael J. Wysocki" <rjw@rjwysocki.net>,
	Len Brown <len.brown@intel.com>
Cc: Lv Zheng <lv.zheng@intel.com>, Lv Zheng <zetalog@gmail.com>,
	<linux-kernel@vger.kernel.org>,
	linux-acpi@vger.kernel.org, Bob Moore <robert.moore@intel.com>
Subject: [PATCH 29/30] ACPICA: Namespace: Reorder \_SB._INI to make sure it is evaluated before _REG evaluations
Date: Thu, 24 Mar 2016 09:41:54 +0800	[thread overview]
Message-ID: <a7bb6b0c5d9df30e297ce37dbc2ff88de98f69cc.1458714003.git.lv.zheng@intel.com> (raw)
In-Reply-To: <cover.1458714002.git.lv.zheng@intel.com>

ACPICA commit f005ee6b90d152c1f499efcca6b771a93903cb55

This patch splits \_SB._INI evaluation from device initialization code, so
that it can be performed before PCI_Config _REG evaluations. This is
required for the device enumeration process. Some named objects are
initialized in \_SB._INI and PCI_Config _REG evaluations may use
uninitialized named objects because of the order issue.

This must be fixed before fixing ECDT order issue. There are existing
tables allowing ECDT EC to be used for the entire device enumeration
process, but the enabling of ECDT EC is done in \_SB._INI. Thus \_SB._INI
must be the first control method evaluated in the device enumeration
process. Normally, the order should be automatically ensured by the device
enumeration process itself (for example, PCI_Config _REGs are evaluated by
the PCI bus driver when the driver is probed by the enumeration process),
but since the process is split on Linux (partially done in Linux, partially
done in ACPICA), we need to ensure this with special logics in order to be
regression safe. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/f005ee6b
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
---
 drivers/acpi/acpica/nsinit.c |   75 ++++++++++++++++++++++++++++++------------
 1 file changed, 54 insertions(+), 21 deletions(-)

diff --git a/drivers/acpi/acpica/nsinit.c b/drivers/acpi/acpica/nsinit.c
index 2de8adb..36643a8 100644
--- a/drivers/acpi/acpica/nsinit.c
+++ b/drivers/acpi/acpica/nsinit.c
@@ -140,6 +140,7 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
 {
 	acpi_status status = AE_OK;
 	struct acpi_device_walk_info info;
+	acpi_handle handle;
 
 	ACPI_FUNCTION_TRACE(ns_initialize_devices);
 
@@ -190,6 +191,27 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
 		if (ACPI_SUCCESS(status)) {
 			info.num_INI++;
 		}
+
+		/*
+		 * Execute \_SB._INI.
+		 * There appears to be a strict order requirement for \_SB._INI,
+		 * which should be evaluated before any _REG evaluations.
+		 */
+		status = acpi_get_handle(NULL, "\\_SB", &handle);
+		if (ACPI_SUCCESS(status)) {
+			memset(info.evaluate_info, 0,
+			       sizeof(struct acpi_evaluate_info));
+			info.evaluate_info->prefix_node = handle;
+			info.evaluate_info->relative_pathname =
+			    METHOD_NAME__INI;
+			info.evaluate_info->parameters = NULL;
+			info.evaluate_info->flags = ACPI_IGNORE_RETURN_VALUE;
+
+			status = acpi_ns_evaluate(info.evaluate_info);
+			if (ACPI_SUCCESS(status)) {
+				info.num_INI++;
+			}
+		}
 	}
 
 	/*
@@ -198,6 +220,12 @@ acpi_status acpi_ns_initialize_devices(u32 flags)
 	 * Note: Any objects accessed by the _REG methods will be automatically
 	 * initialized, even if they contain executable AML (see the call to
 	 * acpi_ns_initialize_objects below).
+	 *
+	 * Note: According to the ACPI specification, we actually needn't execute
+	 * _REG for system_memory/system_io operation regions, but for PCI_Config
+	 * operation regions, it is required to evaluate _REG for those on a PCI
+	 * root bus that doesn't contain _BBN object. So this code is kept here
+	 * in order not to break things.
 	 */
 	if (!(flags & ACPI_NO_ADDRESS_SPACE_INIT)) {
 		ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
@@ -592,32 +620,37 @@ acpi_ns_init_one_device(acpi_handle obj_handle,
 	 * Note: We know there is an _INI within this subtree, but it may not be
 	 * under this particular device, it may be lower in the branch.
 	 */
-	ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
-			(ACPI_TYPE_METHOD, device_node, METHOD_NAME__INI));
-
-	memset(info, 0, sizeof(struct acpi_evaluate_info));
-	info->prefix_node = device_node;
-	info->relative_pathname = METHOD_NAME__INI;
-	info->parameters = NULL;
-	info->flags = ACPI_IGNORE_RETURN_VALUE;
-
-	status = acpi_ns_evaluate(info);
-	if (ACPI_SUCCESS(status)) {
-		walk_info->num_INI++;
-	}
+	if (!ACPI_COMPARE_NAME(device_node->name.ascii, "_SB_") ||
+	    device_node->parent != acpi_gbl_root_node) {
+		ACPI_DEBUG_EXEC(acpi_ut_display_init_pathname
+				(ACPI_TYPE_METHOD, device_node,
+				 METHOD_NAME__INI));
+
+		memset(info, 0, sizeof(struct acpi_evaluate_info));
+		info->prefix_node = device_node;
+		info->relative_pathname = METHOD_NAME__INI;
+		info->parameters = NULL;
+		info->flags = ACPI_IGNORE_RETURN_VALUE;
+
+		status = acpi_ns_evaluate(info);
+		if (ACPI_SUCCESS(status)) {
+			walk_info->num_INI++;
+		}
 #ifdef ACPI_DEBUG_OUTPUT
-	else if (status != AE_NOT_FOUND) {
+		else if (status != AE_NOT_FOUND) {
 
-		/* Ignore error and move on to next device */
+			/* Ignore error and move on to next device */
 
-		char *scope_name =
-		    acpi_ns_get_normalized_pathname(device_node, TRUE);
+			char *scope_name =
+			    acpi_ns_get_normalized_pathname(device_node, TRUE);
 
-		ACPI_EXCEPTION((AE_INFO, status, "during %s._INI execution",
-				scope_name));
-		ACPI_FREE(scope_name);
-	}
+			ACPI_EXCEPTION((AE_INFO, status,
+					"during %s._INI execution",
+					scope_name));
+			ACPI_FREE(scope_name);
+		}
 #endif
+	}
 
 	/* Ignore errors from above */
 
-- 
1.7.10

  parent reply	other threads:[~2016-03-24  1:42 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-03-24  1:38 [PATCH 00/30] ACPICA: 20160318 Release Lv Zheng
2016-03-24  1:38 ` [PATCH 01/30] ACPICA: Linuxize: reduce divergences for 20160212 release Lv Zheng
2016-03-24  1:46   ` Joe Perches
2016-03-24  6:19     ` Zheng, Lv
2016-03-24  6:35       ` Brown, Len
2016-03-24  6:53         ` Zheng, Lv
2016-03-24 11:00       ` Joe Perches
2016-03-28  3:02         ` Zheng, Lv
2016-03-28  3:15           ` Joe Perches
2016-03-29  5:37             ` Zheng, Lv
2016-03-29  5:56               ` Joe Perches
2016-03-24  1:38 ` [PATCH 02/30] ACPICA: Linuxize: Remove useless platform headers Lv Zheng
2016-03-24  1:38 ` [PATCH 03/30] ACPICA: Headers: Add new constants for the DBG2 ACPI table Lv Zheng
2016-03-24  1:38 ` [PATCH 04/30] ACPICA: Headers: Minor update for SPCR " Lv Zheng
2016-03-24  1:38 ` [PATCH 05/30] ACPICA: ACPI 6.1: Updates for the HEST " Lv Zheng
2016-03-24  1:39 ` [PATCH 06/30] ACPICA: IORT: Add in support for the SMMUv3 subtable Lv Zheng
2016-03-24  1:39 ` [PATCH 07/30] ACPICA: ACPI 6.1: Update NFIT table for additional new fields Lv Zheng
2016-03-24  1:39 ` [PATCH 08/30] ACPICA: Headers: Update DMAR table for October 2014 I/O spec Lv Zheng
2016-03-24  1:39 ` [PATCH 09/30] ACPICA: Tables: Update FADT handling Lv Zheng
2016-03-24  1:39 ` [PATCH 10/30] ACPICA: ACPI 6.1: Add full support for this version of ACPI spec Lv Zheng
2016-03-24  1:39 ` [PATCH 11/30] ACPICA: iASL/Headers: Fix incorrect definition of FPDT table Lv Zheng
2016-03-24  1:39 ` [PATCH 12/30] ACPICA: Intepreter: Add object extensions to Concatenate operand Lv Zheng
2016-03-24  1:39 ` [PATCH 13/30] ACPICA: Interpreter: Update some function headers, no functional change Lv Zheng
2016-03-24  1:40 ` [PATCH 14/30] ACPICA: iASL: Cleanup/optimization for ToPLD macro support Lv Zheng
2016-03-24  1:40 ` [PATCH 15/30] ACPICA: Cleanup some invocation indentations, no functional change Lv Zheng
2016-03-24  1:40 ` [PATCH 16/30] ACPICA: Headers: Update generation of the ACPICA library Lv Zheng
2016-03-24  1:40 ` [PATCH 17/30] ACPICA: Add support for QNX 6.6 platform Lv Zheng
2016-03-24  1:40 ` [PATCH 18/30] ACPICA: Utilities: Update for strtoul64 merger Lv Zheng
2016-03-24  1:40 ` [PATCH 19/30] ACPICA: All: const keyword changes across the ACPICA source Lv Zheng
2016-03-24  1:40 ` [PATCH 20/30] ACPICA: iASL/Disassembler: Improve handling of unresolved methods Lv Zheng
2016-03-24  1:40 ` [PATCH 21/30] ACPICA: Utilities: Add ACPI_IS_POWER_OF_TWO() Lv Zheng
2016-03-24  1:41 ` [PATCH 22/30] Utilities: Fix missing parentheses in ACPI_GET_BITS()/ACPI_SET_BITS() Lv Zheng
2016-03-24  1:41 ` [PATCH 23/30] ACPICA: Hardware: Enhance acpi_hw_validate_register() with access_width/bit_offset awareness Lv Zheng
2016-03-24  1:41 ` [PATCH 24/30] ACPICA: Hardware: Add access_width/bit_offset support in acpi_hw_read() Lv Zheng
2016-03-29  8:14   ` Zheng, Lv
2016-03-24  1:41 ` [PATCH 25/30] ACPICA: Hardware: Add access_width/bit_offset support for acpi_hw_write() Lv Zheng
2016-03-24  1:41 ` [PATCH 26/30] ACPICA: Interpreter: Fix wrong conditions for acpi_ev_install_region_handlers() invocation Lv Zheng
2016-03-24  1:41 ` [PATCH 27/30] ACPICA: Tables: Fix wrong MLC condition for dynamic table loading Lv Zheng
2016-03-24  1:41 ` [PATCH 28/30] ACPICA: Events: Fix an issue that _REG association can happen before namespace is initialized Lv Zheng
2016-03-24  1:41 ` Lv Zheng [this message]
2016-03-24  1:42 ` [PATCH 30/30] ACPICA: Update version to 20160318 Lv Zheng
2016-03-24 13:08 ` [PATCH 00/30] ACPICA: 20160318 Release Rafael J. Wysocki
2016-03-28  3:03   ` Zheng, Lv
2016-07-11 14:38   ` Matthias Brugger
2016-07-11 14:48     ` Rafael J. Wysocki
2016-07-11 14:48       ` Matthias Brugger
2016-07-11 14:54       ` Rafael J. Wysocki
2016-07-11 15:20         ` Matthias Brugger

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=a7bb6b0c5d9df30e297ce37dbc2ff88de98f69cc.1458714003.git.lv.zheng@intel.com \
    --to=lv.zheng@intel.com \
    --cc=len.brown@intel.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rafael.j.wysocki@intel.com \
    --cc=rjw@rjwysocki.net \
    --cc=robert.moore@intel.com \
    --cc=zetalog@gmail.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®