Commit 93003de2 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

Merge branches 'acpi-scan', 'acpi-osl', 'acpi-osi' and 'acpi-tables'

Merge ACPI updates related to device enumeration, low-level interface
for ACPICA (OSL), _OSI handling and table parsing for 6.7-rc1:

 - Use the acpi_device_is_present() helper in more places and rename
   acpi_scan_device_not_present() to be about enumeration (James Morse).

 - Add __printf format attribute to acpi_os_vprintf() (Su Hui).

 - Clean up departures from kernel coding style in the low-level
   interface for ACPICA (Jonathan Bergh).

 - Replace strncpy() with strscpy() in acpi_osi_setup() (Justin Stitt).

 - Fail FPDT parsing on zero length records and add proper handling for
   fpdt_process_subtable() to acpi_init_fpdt() (Vasily Khoruzhick).

* acpi-scan:
  ACPI: scan: Rename acpi_scan_device_not_present() to be about enumeration
  ACPI: scan: Use the acpi_device_is_present() helper in more places

* acpi-osl:
  ACPI: OSL: Add empty lines after local variable declarations
  ACPI: OSL: Remove redundant parentheses in return statements
  ACPI: OSL: Fix up white space in parameter lists
  ACPI: OSL: add __printf format attribute to acpi_os_vprintf()

* acpi-osi:
  ACPI: OSI: refactor deprecated strncpy()

* acpi-tables:
  ACPI: FPDT: properly handle invalid FPDT subtables
Loading
Loading
Loading
Loading
+37 −8
Original line number Diff line number Diff line
@@ -194,12 +194,19 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
		record_header = (void *)subtable_header + offset;
		offset += record_header->length;

		if (!record_header->length) {
			pr_err(FW_BUG "Zero-length record found in FPTD.\n");
			result = -EINVAL;
			goto err;
		}

		switch (record_header->type) {
		case RECORD_S3_RESUME:
			if (subtable_type != SUBTABLE_S3PT) {
				pr_err(FW_BUG "Invalid record %d for subtable %s\n",
				     record_header->type, signature);
				return -EINVAL;
				result = -EINVAL;
				goto err;
			}
			if (record_resume) {
				pr_err("Duplicate resume performance record found.\n");
@@ -208,7 +215,7 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
			record_resume = (struct resume_performance_record *)record_header;
			result = sysfs_create_group(fpdt_kobj, &resume_attr_group);
			if (result)
				return result;
				goto err;
			break;
		case RECORD_S3_SUSPEND:
			if (subtable_type != SUBTABLE_S3PT) {
@@ -223,13 +230,14 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
			record_suspend = (struct suspend_performance_record *)record_header;
			result = sysfs_create_group(fpdt_kobj, &suspend_attr_group);
			if (result)
				return result;
				goto err;
			break;
		case RECORD_BOOT:
			if (subtable_type != SUBTABLE_FBPT) {
				pr_err(FW_BUG "Invalid %d for subtable %s\n",
				     record_header->type, signature);
				return -EINVAL;
				result = -EINVAL;
				goto err;
			}
			if (record_boot) {
				pr_err("Duplicate boot performance record found.\n");
@@ -238,7 +246,7 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
			record_boot = (struct boot_performance_record *)record_header;
			result = sysfs_create_group(fpdt_kobj, &boot_attr_group);
			if (result)
				return result;
				goto err;
			break;

		default:
@@ -247,6 +255,18 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
		}
	}
	return 0;

err:
	if (record_boot)
		sysfs_remove_group(fpdt_kobj, &boot_attr_group);

	if (record_suspend)
		sysfs_remove_group(fpdt_kobj, &suspend_attr_group);

	if (record_resume)
		sysfs_remove_group(fpdt_kobj, &resume_attr_group);

	return result;
}

static int __init acpi_init_fpdt(void)
@@ -255,6 +275,7 @@ static int __init acpi_init_fpdt(void)
	struct acpi_table_header *header;
	struct fpdt_subtable_entry *subtable;
	u32 offset = sizeof(*header);
	int result;

	status = acpi_get_table(ACPI_SIG_FPDT, 0, &header);

@@ -263,8 +284,8 @@ static int __init acpi_init_fpdt(void)

	fpdt_kobj = kobject_create_and_add("fpdt", acpi_kobj);
	if (!fpdt_kobj) {
		acpi_put_table(header);
		return -ENOMEM;
		result = -ENOMEM;
		goto err_nomem;
	}

	while (offset < header->length) {
@@ -272,8 +293,10 @@ static int __init acpi_init_fpdt(void)
		switch (subtable->type) {
		case SUBTABLE_FBPT:
		case SUBTABLE_S3PT:
			fpdt_process_subtable(subtable->address,
			result = fpdt_process_subtable(subtable->address,
					      subtable->type);
			if (result)
				goto err_subtable;
			break;
		default:
			/* Other types are reserved in ACPI 6.4 spec. */
@@ -282,6 +305,12 @@ static int __init acpi_init_fpdt(void)
		offset += sizeof(*subtable);
	}
	return 0;
err_subtable:
	kobject_put(fpdt_kobj);

err_nomem:
	acpi_put_table(header);
	return result;
}

fs_initcall(acpi_init_fpdt);
+1 −1
Original line number Diff line number Diff line
@@ -110,7 +110,7 @@ void __init acpi_osi_setup(char *str)
			break;
		} else if (osi->string[0] == '\0') {
			osi->enable = enable;
			strncpy(osi->string, str, OSI_STRING_LENGTH_MAX);
			strscpy(osi->string, str, OSI_STRING_LENGTH_MAX);
			break;
		}
	}
+16 −12
Original line number Diff line number Diff line
@@ -149,7 +149,7 @@ void acpi_os_printf(const char *fmt, ...)
}
EXPORT_SYMBOL(acpi_os_printf);

void acpi_os_vprintf(const char *fmt, va_list args)
void __printf(1, 0) acpi_os_vprintf(const char *fmt, va_list args)
{
	static char buffer[512];

@@ -1067,6 +1067,7 @@ acpi_status acpi_os_execute(acpi_execute_type type,
	struct acpi_os_dpc *dpc;
	struct workqueue_struct *queue;
	int ret;

	ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
			  "Scheduling function [%p(%p)] for deferred execution.\n",
			  function, context));
@@ -1522,6 +1523,7 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
	__acquires(lockp)
{
	acpi_cpu_flags flags;

	spin_lock_irqsave(lockp, flags);
	return flags;
}
@@ -1578,7 +1580,7 @@ acpi_os_create_cache(char *name, u16 size, u16 depth, acpi_cache_t ** cache)
acpi_status acpi_os_purge_cache(acpi_cache_t *cache)
{
	kmem_cache_shrink(cache);
	return (AE_OK);
	return AE_OK;
}

/*******************************************************************************
@@ -1597,7 +1599,7 @@ acpi_status acpi_os_purge_cache(acpi_cache_t * cache)
acpi_status acpi_os_delete_cache(acpi_cache_t *cache)
{
	kmem_cache_destroy(cache);
	return (AE_OK);
	return AE_OK;
}

/*******************************************************************************
@@ -1617,7 +1619,7 @@ acpi_status acpi_os_delete_cache(acpi_cache_t * cache)
acpi_status acpi_os_release_object(acpi_cache_t *cache, void *object)
{
	kmem_cache_free(cache, object);
	return (AE_OK);
	return AE_OK;
}
#endif

@@ -1708,6 +1710,7 @@ acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control,
				  u32 pm1b_control)
{
	int rc = 0;

	if (__acpi_os_prepare_sleep)
		rc = __acpi_os_prepare_sleep(sleep_state,
					     pm1a_control, pm1b_control);
@@ -1730,6 +1733,7 @@ acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a,
				  u32 val_b)
{
	int rc = 0;

	if (__acpi_os_prepare_extended_sleep)
		rc = __acpi_os_prepare_extended_sleep(sleep_state,
					     val_a, val_b);
+6 −6
Original line number Diff line number Diff line
@@ -289,10 +289,10 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
	return 0;
}

static int acpi_scan_device_not_present(struct acpi_device *adev)
static int acpi_scan_device_not_enumerated(struct acpi_device *adev)
{
	if (!acpi_device_enumerated(adev)) {
		dev_warn(&adev->dev, "Still not present\n");
		dev_warn(&adev->dev, "Still not enumerated\n");
		return -EALREADY;
	}
	acpi_bus_trim(adev);
@@ -304,7 +304,7 @@ static int acpi_scan_device_check(struct acpi_device *adev)
	int error;

	acpi_bus_get_status(adev);
	if (adev->status.present || adev->status.functional) {
	if (acpi_device_is_present(adev)) {
		/*
		 * This function is only called for device objects for which
		 * matching scan handlers exist.  The only situation in which
@@ -327,7 +327,7 @@ static int acpi_scan_device_check(struct acpi_device *adev)
			error = -ENODEV;
		}
	} else {
		error = acpi_scan_device_not_present(adev);
		error = acpi_scan_device_not_enumerated(adev);
	}
	return error;
}
@@ -338,8 +338,8 @@ static int acpi_scan_bus_check(struct acpi_device *adev, void *not_used)
	int error;

	acpi_bus_get_status(adev);
	if (!(adev->status.present || adev->status.functional)) {
		acpi_scan_device_not_present(adev);
	if (!acpi_device_is_present(adev)) {
		acpi_scan_device_not_enumerated(adev);
		return 0;
	}
	if (handler && handler->hotplug.scan_dependent)