Commit 0b2f18e7 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
Pull ACPI fixes from Rafael Wysocki:
 "These fix two recent issues in the ACPI memory mappings management
  code and tighten up error handling in the ACPI driver for AMD SoCs
  (APD).

  Specifics:

   - Avoid redundant rounding to the page size in acpi_os_map_iomem() to
     address a recently introduced issue with the EFI memory map
     permission check on ARM64 (Ard Biesheuvel).

   - Fix acpi_release_memory() to wait until the memory mappings
     released by it have been really unmapped (Rafael Wysocki).

   - Make the ACPI driver for AMD SoCs (APD) check the return value of
     acpi_dev_get_property() to avoid failures in the cases when the
     device property under inspection is missing (Furquan Shaikh)"

* tag 'acpi-5.9-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI: OSL: Prevent acpi_release_memory() from returning too early
  ACPI: ioremap: avoid redundant rounding to OS page size
  ACPI: SoC: APD: Check return value of acpi_dev_get_property()
parents 326e311b 4f31d53c
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ static int fch_misc_setup(struct apd_private_data *pdata)
	if (ret < 0)
		return -ENOENT;

	acpi_dev_get_property(adev, "is-rv", ACPI_TYPE_INTEGER, &obj);
	if (!acpi_dev_get_property(adev, "is-rv", ACPI_TYPE_INTEGER, &obj))
		clk_data->is_rv = obj->integer.value;

	list_for_each_entry(rentry, &resource_list, node) {
+19 −4
Original line number Diff line number Diff line
@@ -350,7 +350,7 @@ void __iomem __ref

	pg_off = round_down(phys, PAGE_SIZE);
	pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off;
	virt = acpi_map(pg_off, pg_sz);
	virt = acpi_map(phys, size);
	if (!virt) {
		mutex_unlock(&acpi_ioremap_lock);
		kfree(map);
@@ -358,7 +358,7 @@ void __iomem __ref
	}

	INIT_LIST_HEAD(&map->list);
	map->virt = virt;
	map->virt = (void __iomem __force *)((unsigned long)virt & PAGE_MASK);
	map->phys = pg_off;
	map->size = pg_sz;
	map->track.refcount = 1;
@@ -1575,11 +1575,26 @@ static acpi_status acpi_deactivate_mem_region(acpi_handle handle, u32 level,
acpi_status acpi_release_memory(acpi_handle handle, struct resource *res,
				u32 level)
{
	acpi_status status;

	if (!(res->flags & IORESOURCE_MEM))
		return AE_TYPE;

	return acpi_walk_namespace(ACPI_TYPE_REGION, handle, level,
				   acpi_deactivate_mem_region, NULL, res, NULL);
	status = acpi_walk_namespace(ACPI_TYPE_REGION, handle, level,
				     acpi_deactivate_mem_region, NULL,
				     res, NULL);
	if (ACPI_FAILURE(status))
		return status;

	/*
	 * Wait for all of the mappings queued up for removal by
	 * acpi_deactivate_mem_region() to actually go away.
	 */
	synchronize_rcu();
	rcu_barrier();
	flush_scheduled_work();

	return AE_OK;
}
EXPORT_SYMBOL_GPL(acpi_release_memory);