Browse Source

Merge branches 'acpi-init', 'acpi-osl', 'acpi-bus', 'acpi-tables' and 'acpi-misc'

* acpi-init:
  ACPI: probe ECDT before loading AML tables regardless of module-level code flag

* acpi-osl:
  ACPI / OSL: Use 'jiffies' as the time bassis for acpi_os_get_timer()

* acpi-bus:
  ACPI / glue: Split dev_is_platform() out of module for wide use

* acpi-tables:
  ACPI/PPTT: Handle architecturally unknown cache types
  drivers: base: cacheinfo: Do not populate sysfs for unknown cache types

* acpi-misc:
  ACPI: remove redundant 'default n' from Kconfig
  ACPI: custom_method: remove meaningless null check before debugfs_remove()
Rafael J. Wysocki 6 years ago

+ 0 - 6
drivers/acpi/Kconfig

@@ -138,7 +138,6 @@ config ACPI_REV_OVERRIDE_POSSIBLE
 
 
 config ACPI_EC_DEBUGFS
 config ACPI_EC_DEBUGFS
 	tristate "EC read/write access through /sys/kernel/debug/ec"
 	tristate "EC read/write access through /sys/kernel/debug/ec"
-	default n
 	help
 	help
 	  Say N to disable Embedded Controller /sys/kernel/debug interface
 	  Say N to disable Embedded Controller /sys/kernel/debug interface
 
 
@@ -283,7 +282,6 @@ config ACPI_PROCESSOR
 config ACPI_IPMI
 config ACPI_IPMI
 	tristate "IPMI"
 	tristate "IPMI"
 	depends on IPMI_HANDLER
 	depends on IPMI_HANDLER
-	default n
 	help
 	help
 	  This driver enables the ACPI to access the BMC controller. And it
 	  This driver enables the ACPI to access the BMC controller. And it
 	  uses the IPMI request/response message to communicate with BMC
 	  uses the IPMI request/response message to communicate with BMC
@@ -361,7 +359,6 @@ config ACPI_TABLE_UPGRADE
 
 
 config ACPI_DEBUG
 config ACPI_DEBUG
 	bool "Debug Statements"
 	bool "Debug Statements"
-	default n
 	help
 	help
 	  The ACPI subsystem can produce debug output.  Saying Y enables this
 	  The ACPI subsystem can produce debug output.  Saying Y enables this
 	  output and increases the kernel size by around 50K.
 	  output and increases the kernel size by around 50K.
@@ -374,7 +371,6 @@ config ACPI_DEBUG
 config ACPI_PCI_SLOT
 config ACPI_PCI_SLOT
 	bool "PCI slot detection driver"
 	bool "PCI slot detection driver"
 	depends on SYSFS
 	depends on SYSFS
-	default n
 	help
 	help
 	  This driver creates entries in /sys/bus/pci/slots/ for all PCI
 	  This driver creates entries in /sys/bus/pci/slots/ for all PCI
 	  slots in the system.  This can help correlate PCI bus addresses,
 	  slots in the system.  This can help correlate PCI bus addresses,
@@ -436,7 +432,6 @@ config ACPI_HED
 config ACPI_CUSTOM_METHOD
 config ACPI_CUSTOM_METHOD
 	tristate "Allow ACPI methods to be inserted/replaced at run time"
 	tristate "Allow ACPI methods to be inserted/replaced at run time"
 	depends on DEBUG_FS
 	depends on DEBUG_FS
-	default n
 	help
 	help
 	  This debug facility allows ACPI AML methods to be inserted and/or
 	  This debug facility allows ACPI AML methods to be inserted and/or
 	  replaced without rebooting the system. For details refer to:
 	  replaced without rebooting the system. For details refer to:
@@ -481,7 +476,6 @@ config ACPI_EXTLOG
 	tristate "Extended Error Log support"
 	tristate "Extended Error Log support"
 	depends on X86_MCE && X86_LOCAL_APIC && EDAC
 	depends on X86_MCE && X86_LOCAL_APIC && EDAC
 	select UEFI_CPER
 	select UEFI_CPER
-	default n
 	help
 	help
 	  Certain usages such as Predictive Failure Analysis (PFA) require
 	  Certain usages such as Predictive Failure Analysis (PFA) require
 	  more information about the error than what can be described in
 	  more information about the error than what can be described in

+ 16 - 28
drivers/acpi/bus.c

@@ -1054,15 +1054,17 @@ void __init acpi_early_init(void)
 		goto error0;
 		goto error0;
 	}
 	}
 
 
-	if (!acpi_gbl_execute_tables_as_methods &&
-	    acpi_gbl_group_module_level_code) {
-		status = acpi_load_tables();
-		if (ACPI_FAILURE(status)) {
-			printk(KERN_ERR PREFIX
-			       "Unable to load the System Description Tables\n");
-			goto error0;
-		}
-	}
+	/*
+	 * ACPI 2.0 requires the EC driver to be loaded and work before
+	 * the EC device is found in the namespace (i.e. before
+	 * acpi_load_tables() is called).
+	 *
+	 * This is accomplished by looking for the ECDT table, and getting
+	 * the EC parameters out of that.
+	 *
+	 * Ignore the result. Not having an ECDT is not fatal.
+	 */
+	status = acpi_ec_ecdt_probe();
 
 
 #ifdef CONFIG_X86
 #ifdef CONFIG_X86
 	if (!acpi_ioapic) {
 	if (!acpi_ioapic) {
@@ -1133,25 +1135,11 @@ static int __init acpi_bus_init(void)
 
 
 	acpi_os_initialize1();
 	acpi_os_initialize1();
 
 
-	/*
-	 * ACPI 2.0 requires the EC driver to be loaded and work before
-	 * the EC device is found in the namespace (i.e. before
-	 * acpi_load_tables() is called).
-	 *
-	 * This is accomplished by looking for the ECDT table, and getting
-	 * the EC parameters out of that.
-	 */
-	status = acpi_ec_ecdt_probe();
-	/* Ignore result. Not having an ECDT is not fatal. */
-
-	if (acpi_gbl_execute_tables_as_methods ||
-	    !acpi_gbl_group_module_level_code) {
-		status = acpi_load_tables();
-		if (ACPI_FAILURE(status)) {
-			printk(KERN_ERR PREFIX
-			       "Unable to load the System Description Tables\n");
-			goto error1;
-		}
+	status = acpi_load_tables();
+	if (ACPI_FAILURE(status)) {
+		printk(KERN_ERR PREFIX
+		       "Unable to load the System Description Tables\n");
+		goto error1;
 	}
 	}
 
 
 	status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);
 	status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);

+ 1 - 2
drivers/acpi/custom_method.c

@@ -92,8 +92,7 @@ static int __init acpi_custom_method_init(void)
 
 
 static void __exit acpi_custom_method_exit(void)
 static void __exit acpi_custom_method_exit(void)
 {
 {
-	if (cm_dentry)
-		debugfs_remove(cm_dentry);
+	debugfs_remove(cm_dentry);
 }
 }
 
 
 module_init(acpi_custom_method_init);
 module_init(acpi_custom_method_init);

+ 1 - 1
drivers/acpi/glue.c

@@ -320,7 +320,7 @@ static int acpi_platform_notify(struct device *dev)
 	if (!adev)
 	if (!adev)
 		goto out;
 		goto out;
 
 
-	if (dev->bus == &platform_bus_type)
+	if (dev_is_platform(dev))
 		acpi_configure_pmsi_domain(dev);
 		acpi_configure_pmsi_domain(dev);
 
 
 	if (type && type->setup)
 	if (type && type->setup)

+ 9 - 6
drivers/acpi/osl.c

@@ -617,15 +617,18 @@ void acpi_os_stall(u32 us)
 }
 }
 
 
 /*
 /*
- * Support ACPI 3.0 AML Timer operand
- * Returns 64-bit free-running, monotonically increasing timer
- * with 100ns granularity
+ * Support ACPI 3.0 AML Timer operand. Returns a 64-bit free-running,
+ * monotonically increasing timer with 100ns granularity. Do not use
+ * ktime_get() to implement this function because this function may get
+ * called after timekeeping has been suspended. Note: calling this function
+ * after timekeeping has been suspended may lead to unexpected results
+ * because when timekeeping is suspended the jiffies counter is not
+ * incremented. See also timekeeping_suspend().
  */
  */
 u64 acpi_os_get_timer(void)
 u64 acpi_os_get_timer(void)
 {
 {
-	u64 time_ns = ktime_to_ns(ktime_get());
-	do_div(time_ns, 100);
-	return time_ns;
+	return (get_jiffies_64() - INITIAL_JIFFIES) *
+		(ACPI_100NSEC_PER_SEC / HZ);
 }
 }
 
 
 acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)
 acpi_status acpi_os_read_port(acpi_io_address port, u32 * value, u32 width)

+ 13 - 20
drivers/acpi/pptt.c

@@ -338,9 +338,6 @@ static struct acpi_pptt_cache *acpi_find_cache_node(struct acpi_table_header *ta
 	return found;
 	return found;
 }
 }
 
 
-/* total number of attributes checked by the properties code */
-#define PPTT_CHECKED_ATTRIBUTES 4
-
 /**
 /**
  * update_cache_properties() - Update cacheinfo for the given processor
  * update_cache_properties() - Update cacheinfo for the given processor
  * @this_leaf: Kernel cache info structure being updated
  * @this_leaf: Kernel cache info structure being updated
@@ -357,25 +354,15 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
 				    struct acpi_pptt_cache *found_cache,
 				    struct acpi_pptt_cache *found_cache,
 				    struct acpi_pptt_processor *cpu_node)
 				    struct acpi_pptt_processor *cpu_node)
 {
 {
-	int valid_flags = 0;
-
 	this_leaf->fw_token = cpu_node;
 	this_leaf->fw_token = cpu_node;
-	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_SIZE_PROPERTY_VALID)
 		this_leaf->size = found_cache->size;
 		this_leaf->size = found_cache->size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID) {
+	if (found_cache->flags & ACPI_PPTT_LINE_SIZE_VALID)
 		this_leaf->coherency_line_size = found_cache->line_size;
 		this_leaf->coherency_line_size = found_cache->line_size;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID) {
+	if (found_cache->flags & ACPI_PPTT_NUMBER_OF_SETS_VALID)
 		this_leaf->number_of_sets = found_cache->number_of_sets;
 		this_leaf->number_of_sets = found_cache->number_of_sets;
-		valid_flags++;
-	}
-	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID) {
+	if (found_cache->flags & ACPI_PPTT_ASSOCIATIVITY_VALID)
 		this_leaf->ways_of_associativity = found_cache->associativity;
 		this_leaf->ways_of_associativity = found_cache->associativity;
-		valid_flags++;
-	}
 	if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
 	if (found_cache->flags & ACPI_PPTT_WRITE_POLICY_VALID) {
 		switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
 		switch (found_cache->attributes & ACPI_PPTT_MASK_WRITE_POLICY) {
 		case ACPI_PPTT_CACHE_POLICY_WT:
 		case ACPI_PPTT_CACHE_POLICY_WT:
@@ -402,11 +389,17 @@ static void update_cache_properties(struct cacheinfo *this_leaf,
 		}
 		}
 	}
 	}
 	/*
 	/*
-	 * If the above flags are valid, and the cache type is NOCACHE
-	 * update the cache type as well.
+	 * If cache type is NOCACHE, then the cache hasn't been specified
+	 * via other mechanisms.  Update the type if a cache type has been
+	 * provided.
+	 *
+	 * Note, we assume such caches are unified based on conventional system
+	 * design and known examples.  Significant work is required elsewhere to
+	 * fully support data/instruction only type caches which are only
+	 * specified in PPTT.
 	 */
 	 */
 	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
 	if (this_leaf->type == CACHE_TYPE_NOCACHE &&
-	    valid_flags == PPTT_CHECKED_ATTRIBUTES)
+	    found_cache->flags & ACPI_PPTT_CACHE_TYPE_VALID)
 		this_leaf->type = CACHE_TYPE_UNIFIED;
 		this_leaf->type = CACHE_TYPE_UNIFIED;
 }
 }
 
 

+ 2 - 0
drivers/base/cacheinfo.c

@@ -615,6 +615,8 @@ static int cache_add_dev(unsigned int cpu)
 		this_leaf = this_cpu_ci->info_list + i;
 		this_leaf = this_cpu_ci->info_list + i;
 		if (this_leaf->disable_sysfs)
 		if (this_leaf->disable_sysfs)
 			continue;
 			continue;
+		if (this_leaf->type == CACHE_TYPE_NOCACHE)
+			break;
 		cache_groups = cache_get_attribute_groups(this_leaf);
 		cache_groups = cache_get_attribute_groups(this_leaf);
 		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
 		ci_dev = cpu_device_create(parent, this_leaf, cache_groups,
 					   "index%1u", i);
 					   "index%1u", i);

+ 1 - 0
include/linux/platform_device.h

@@ -40,6 +40,7 @@ struct platform_device {
 
 
 #define platform_get_device_id(pdev)	((pdev)->id_entry)
 #define platform_get_device_id(pdev)	((pdev)->id_entry)
 
 
+#define dev_is_platform(dev) ((dev)->bus == &platform_bus_type)
 #define to_platform_device(x) container_of((x), struct platform_device, dev)
 #define to_platform_device(x) container_of((x), struct platform_device, dev)
 
 
 extern int platform_device_register(struct platform_device *);
 extern int platform_device_register(struct platform_device *);