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

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
...@@ -194,12 +194,19 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type) ...@@ -194,12 +194,19 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
record_header = (void *)subtable_header + offset; record_header = (void *)subtable_header + offset;
offset += record_header->length; 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) { switch (record_header->type) {
case RECORD_S3_RESUME: case RECORD_S3_RESUME:
if (subtable_type != SUBTABLE_S3PT) { if (subtable_type != SUBTABLE_S3PT) {
pr_err(FW_BUG "Invalid record %d for subtable %s\n", pr_err(FW_BUG "Invalid record %d for subtable %s\n",
record_header->type, signature); record_header->type, signature);
return -EINVAL; result = -EINVAL;
goto err;
} }
if (record_resume) { if (record_resume) {
pr_err("Duplicate resume performance record found.\n"); pr_err("Duplicate resume performance record found.\n");
...@@ -208,7 +215,7 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type) ...@@ -208,7 +215,7 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
record_resume = (struct resume_performance_record *)record_header; record_resume = (struct resume_performance_record *)record_header;
result = sysfs_create_group(fpdt_kobj, &resume_attr_group); result = sysfs_create_group(fpdt_kobj, &resume_attr_group);
if (result) if (result)
return result; goto err;
break; break;
case RECORD_S3_SUSPEND: case RECORD_S3_SUSPEND:
if (subtable_type != SUBTABLE_S3PT) { if (subtable_type != SUBTABLE_S3PT) {
...@@ -223,13 +230,14 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type) ...@@ -223,13 +230,14 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
record_suspend = (struct suspend_performance_record *)record_header; record_suspend = (struct suspend_performance_record *)record_header;
result = sysfs_create_group(fpdt_kobj, &suspend_attr_group); result = sysfs_create_group(fpdt_kobj, &suspend_attr_group);
if (result) if (result)
return result; goto err;
break; break;
case RECORD_BOOT: case RECORD_BOOT:
if (subtable_type != SUBTABLE_FBPT) { if (subtable_type != SUBTABLE_FBPT) {
pr_err(FW_BUG "Invalid %d for subtable %s\n", pr_err(FW_BUG "Invalid %d for subtable %s\n",
record_header->type, signature); record_header->type, signature);
return -EINVAL; result = -EINVAL;
goto err;
} }
if (record_boot) { if (record_boot) {
pr_err("Duplicate boot performance record found.\n"); pr_err("Duplicate boot performance record found.\n");
...@@ -238,7 +246,7 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type) ...@@ -238,7 +246,7 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
record_boot = (struct boot_performance_record *)record_header; record_boot = (struct boot_performance_record *)record_header;
result = sysfs_create_group(fpdt_kobj, &boot_attr_group); result = sysfs_create_group(fpdt_kobj, &boot_attr_group);
if (result) if (result)
return result; goto err;
break; break;
default: default:
...@@ -247,6 +255,18 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type) ...@@ -247,6 +255,18 @@ static int fpdt_process_subtable(u64 address, u32 subtable_type)
} }
} }
return 0; 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) static int __init acpi_init_fpdt(void)
...@@ -255,6 +275,7 @@ static int __init acpi_init_fpdt(void) ...@@ -255,6 +275,7 @@ static int __init acpi_init_fpdt(void)
struct acpi_table_header *header; struct acpi_table_header *header;
struct fpdt_subtable_entry *subtable; struct fpdt_subtable_entry *subtable;
u32 offset = sizeof(*header); u32 offset = sizeof(*header);
int result;
status = acpi_get_table(ACPI_SIG_FPDT, 0, &header); status = acpi_get_table(ACPI_SIG_FPDT, 0, &header);
...@@ -263,8 +284,8 @@ static int __init acpi_init_fpdt(void) ...@@ -263,8 +284,8 @@ static int __init acpi_init_fpdt(void)
fpdt_kobj = kobject_create_and_add("fpdt", acpi_kobj); fpdt_kobj = kobject_create_and_add("fpdt", acpi_kobj);
if (!fpdt_kobj) { if (!fpdt_kobj) {
acpi_put_table(header); result = -ENOMEM;
return -ENOMEM; goto err_nomem;
} }
while (offset < header->length) { while (offset < header->length) {
...@@ -272,8 +293,10 @@ static int __init acpi_init_fpdt(void) ...@@ -272,8 +293,10 @@ static int __init acpi_init_fpdt(void)
switch (subtable->type) { switch (subtable->type) {
case SUBTABLE_FBPT: case SUBTABLE_FBPT:
case SUBTABLE_S3PT: case SUBTABLE_S3PT:
fpdt_process_subtable(subtable->address, result = fpdt_process_subtable(subtable->address,
subtable->type); subtable->type);
if (result)
goto err_subtable;
break; break;
default: default:
/* Other types are reserved in ACPI 6.4 spec. */ /* Other types are reserved in ACPI 6.4 spec. */
...@@ -282,6 +305,12 @@ static int __init acpi_init_fpdt(void) ...@@ -282,6 +305,12 @@ static int __init acpi_init_fpdt(void)
offset += sizeof(*subtable); offset += sizeof(*subtable);
} }
return 0; return 0;
err_subtable:
kobject_put(fpdt_kobj);
err_nomem:
acpi_put_table(header);
return result;
} }
fs_initcall(acpi_init_fpdt); fs_initcall(acpi_init_fpdt);
...@@ -110,7 +110,7 @@ void __init acpi_osi_setup(char *str) ...@@ -110,7 +110,7 @@ void __init acpi_osi_setup(char *str)
break; break;
} else if (osi->string[0] == '\0') { } else if (osi->string[0] == '\0') {
osi->enable = enable; osi->enable = enable;
strncpy(osi->string, str, OSI_STRING_LENGTH_MAX); strscpy(osi->string, str, OSI_STRING_LENGTH_MAX);
break; break;
} }
} }
......
...@@ -149,7 +149,7 @@ void acpi_os_printf(const char *fmt, ...) ...@@ -149,7 +149,7 @@ void acpi_os_printf(const char *fmt, ...)
} }
EXPORT_SYMBOL(acpi_os_printf); 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]; static char buffer[512];
...@@ -493,7 +493,7 @@ EXPORT_SYMBOL(acpi_os_unmap_generic_address); ...@@ -493,7 +493,7 @@ EXPORT_SYMBOL(acpi_os_unmap_generic_address);
#ifdef ACPI_FUTURE_USAGE #ifdef ACPI_FUTURE_USAGE
acpi_status acpi_status
acpi_os_get_physical_address(void *virt, acpi_physical_address * phys) acpi_os_get_physical_address(void *virt, acpi_physical_address *phys)
{ {
if (!phys || !virt) if (!phys || !virt)
return AE_BAD_PARAMETER; return AE_BAD_PARAMETER;
...@@ -784,7 +784,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u64 value, u32 width) ...@@ -784,7 +784,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u64 value, u32 width)
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
acpi_status acpi_status
acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, acpi_os_read_pci_configuration(struct acpi_pci_id *pci_id, u32 reg,
u64 *value, u32 width) u64 *value, u32 width)
{ {
int result, size; int result, size;
...@@ -816,7 +816,7 @@ acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, ...@@ -816,7 +816,7 @@ acpi_os_read_pci_configuration(struct acpi_pci_id * pci_id, u32 reg,
} }
acpi_status acpi_status
acpi_os_write_pci_configuration(struct acpi_pci_id * pci_id, u32 reg, acpi_os_write_pci_configuration(struct acpi_pci_id *pci_id, u32 reg,
u64 value, u32 width) u64 value, u32 width)
{ {
int result, size; int result, size;
...@@ -1067,6 +1067,7 @@ acpi_status acpi_os_execute(acpi_execute_type type, ...@@ -1067,6 +1067,7 @@ acpi_status acpi_os_execute(acpi_execute_type type,
struct acpi_os_dpc *dpc; struct acpi_os_dpc *dpc;
struct workqueue_struct *queue; struct workqueue_struct *queue;
int ret; int ret;
ACPI_DEBUG_PRINT((ACPI_DB_EXEC, ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
"Scheduling function [%p(%p)] for deferred execution.\n", "Scheduling function [%p(%p)] for deferred execution.\n",
function, context)); function, context));
...@@ -1197,7 +1198,7 @@ bool acpi_queue_hotplug_work(struct work_struct *work) ...@@ -1197,7 +1198,7 @@ bool acpi_queue_hotplug_work(struct work_struct *work)
} }
acpi_status acpi_status
acpi_os_create_semaphore(u32 max_units, u32 initial_units, acpi_handle * handle) acpi_os_create_semaphore(u32 max_units, u32 initial_units, acpi_handle *handle)
{ {
struct semaphore *sem = NULL; struct semaphore *sem = NULL;
...@@ -1522,6 +1523,7 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp) ...@@ -1522,6 +1523,7 @@ acpi_cpu_flags acpi_os_acquire_lock(acpi_spinlock lockp)
__acquires(lockp) __acquires(lockp)
{ {
acpi_cpu_flags flags; acpi_cpu_flags flags;
spin_lock_irqsave(lockp, flags); spin_lock_irqsave(lockp, flags);
return flags; return flags;
} }
...@@ -1554,7 +1556,7 @@ void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags) ...@@ -1554,7 +1556,7 @@ void acpi_os_release_lock(acpi_spinlock lockp, acpi_cpu_flags flags)
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_os_create_cache(char *name, u16 size, u16 depth, acpi_cache_t ** cache) acpi_os_create_cache(char *name, u16 size, u16 depth, acpi_cache_t **cache)
{ {
*cache = kmem_cache_create(name, size, 0, 0, NULL); *cache = kmem_cache_create(name, size, 0, 0, NULL);
if (*cache == NULL) if (*cache == NULL)
...@@ -1575,10 +1577,10 @@ acpi_os_create_cache(char *name, u16 size, u16 depth, acpi_cache_t ** cache) ...@@ -1575,10 +1577,10 @@ acpi_os_create_cache(char *name, u16 size, u16 depth, acpi_cache_t ** cache)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_os_purge_cache(acpi_cache_t * cache) acpi_status acpi_os_purge_cache(acpi_cache_t *cache)
{ {
kmem_cache_shrink(cache); kmem_cache_shrink(cache);
return (AE_OK); return AE_OK;
} }
/******************************************************************************* /*******************************************************************************
...@@ -1594,10 +1596,10 @@ acpi_status acpi_os_purge_cache(acpi_cache_t * cache) ...@@ -1594,10 +1596,10 @@ acpi_status acpi_os_purge_cache(acpi_cache_t * cache)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_os_delete_cache(acpi_cache_t * cache) acpi_status acpi_os_delete_cache(acpi_cache_t *cache)
{ {
kmem_cache_destroy(cache); kmem_cache_destroy(cache);
return (AE_OK); return AE_OK;
} }
/******************************************************************************* /*******************************************************************************
...@@ -1614,10 +1616,10 @@ acpi_status acpi_os_delete_cache(acpi_cache_t * cache) ...@@ -1614,10 +1616,10 @@ acpi_status acpi_os_delete_cache(acpi_cache_t * cache)
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object) acpi_status acpi_os_release_object(acpi_cache_t *cache, void *object)
{ {
kmem_cache_free(cache, object); kmem_cache_free(cache, object);
return (AE_OK); return AE_OK;
} }
#endif #endif
...@@ -1708,6 +1710,7 @@ acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control, ...@@ -1708,6 +1710,7 @@ acpi_status acpi_os_prepare_sleep(u8 sleep_state, u32 pm1a_control,
u32 pm1b_control) u32 pm1b_control)
{ {
int rc = 0; int rc = 0;
if (__acpi_os_prepare_sleep) if (__acpi_os_prepare_sleep)
rc = __acpi_os_prepare_sleep(sleep_state, rc = __acpi_os_prepare_sleep(sleep_state,
pm1a_control, pm1b_control); pm1a_control, pm1b_control);
...@@ -1730,6 +1733,7 @@ acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a, ...@@ -1730,6 +1733,7 @@ acpi_status acpi_os_prepare_extended_sleep(u8 sleep_state, u32 val_a,
u32 val_b) u32 val_b)
{ {
int rc = 0; int rc = 0;
if (__acpi_os_prepare_extended_sleep) if (__acpi_os_prepare_extended_sleep)
rc = __acpi_os_prepare_extended_sleep(sleep_state, rc = __acpi_os_prepare_extended_sleep(sleep_state,
val_a, val_b); val_a, val_b);
......
...@@ -289,10 +289,10 @@ static int acpi_scan_hot_remove(struct acpi_device *device) ...@@ -289,10 +289,10 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
return 0; 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)) { if (!acpi_device_enumerated(adev)) {
dev_warn(&adev->dev, "Still not present\n"); dev_warn(&adev->dev, "Still not enumerated\n");
return -EALREADY; return -EALREADY;
} }
acpi_bus_trim(adev); acpi_bus_trim(adev);
...@@ -304,7 +304,7 @@ static int acpi_scan_device_check(struct acpi_device *adev) ...@@ -304,7 +304,7 @@ static int acpi_scan_device_check(struct acpi_device *adev)
int error; int error;
acpi_bus_get_status(adev); 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 * This function is only called for device objects for which
* matching scan handlers exist. The only situation in which * matching scan handlers exist. The only situation in which
...@@ -327,7 +327,7 @@ static int acpi_scan_device_check(struct acpi_device *adev) ...@@ -327,7 +327,7 @@ static int acpi_scan_device_check(struct acpi_device *adev)
error = -ENODEV; error = -ENODEV;
} }
} else { } else {
error = acpi_scan_device_not_present(adev); error = acpi_scan_device_not_enumerated(adev);
} }
return error; return error;
} }
...@@ -338,8 +338,8 @@ static int acpi_scan_bus_check(struct acpi_device *adev, void *not_used) ...@@ -338,8 +338,8 @@ static int acpi_scan_bus_check(struct acpi_device *adev, void *not_used)
int error; int error;
acpi_bus_get_status(adev); acpi_bus_get_status(adev);
if (!(adev->status.present || adev->status.functional)) { if (!acpi_device_is_present(adev)) {
acpi_scan_device_not_present(adev); acpi_scan_device_not_enumerated(adev);
return 0; return 0;
} }
if (handler && handler->hotplug.scan_dependent) if (handler && handler->hotplug.scan_dependent)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment