]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/commitdiff
Merge tag 'acpi-extra-4.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Dec 2016 18:19:32 +0000 (10:19 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 22 Dec 2016 18:19:32 +0000 (10:19 -0800)
Pull more ACPI updates from Rafael Wysocki:
 "Here are new versions of two ACPICA changes that were deferred
  previously due to a problem they had introduced, two cleanups on top
  of them and the removal of a useless warning message from the ACPI
  core.

  Specifics:

   - Move some Linux-specific functionality to upstream ACPICA and
     update the in-kernel users of it accordingly (Lv Zheng)

   - Drop a useless warning (triggered by the lack of an optional
     object) from the ACPI namespace scanning code (Zhang Rui)"

* tag 'acpi-extra-4.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm:
  ACPI / osl: Remove deprecated acpi_get_table_with_size()/early_acpi_os_unmap_memory()
  ACPI / osl: Remove acpi_get_table_with_size()/early_acpi_os_unmap_memory() users
  ACPICA: Tables: Allow FADT to be customized with virtual address
  ACPICA: Tables: Back port acpi_get_table_with_size() and early_acpi_os_unmap_memory() from Linux kernel
  ACPI: do not warn if _BQC does not exist

22 files changed:
arch/arm64/include/asm/acpi.h
arch/arm64/kernel/acpi.c
drivers/acpi/acpica/actables.h
drivers/acpi/acpica/tbfadt.c
drivers/acpi/acpica/tbutils.c
drivers/acpi/acpica/tbxface.c
drivers/acpi/bus.c
drivers/acpi/nfit/core.c
drivers/acpi/osl.c
drivers/acpi/processor_core.c
drivers/acpi/scan.c
drivers/acpi/spcr.c
drivers/acpi/tables.c
drivers/gpu/drm/amd/amdgpu/amdgpu_bios.c
drivers/gpu/drm/radeon/radeon_bios.c
drivers/iommu/amd_iommu_init.c
drivers/iommu/dmar.c
drivers/mailbox/pcc.c
include/acpi/acpi_io.h
include/acpi/acpixf.h
include/acpi/actbl.h
include/acpi/platform/aclinuxex.h

index d0de0e032bc2c689f849ee679754f7b18d9451c3..c1976c0adca73025ec4526fc40be077101f8ef62 100644 (file)
@@ -29,7 +29,7 @@
 
 /* Basic configuration for ACPI */
 #ifdef CONFIG_ACPI
-/* ACPI table mapping after acpi_gbl_permanent_mmap is set */
+/* ACPI table mapping after acpi_permanent_mmap is set */
 static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,
                                            acpi_size size)
 {
index 252a6d9c1da5d7868fffd23ec6ed93a95944c91d..64d9cbd61678233dc24648f11bb5b242df3ee244 100644 (file)
@@ -132,14 +132,13 @@ static int __init acpi_fadt_sanity_check(void)
        struct acpi_table_header *table;
        struct acpi_table_fadt *fadt;
        acpi_status status;
-       acpi_size tbl_size;
        int ret = 0;
 
        /*
         * FADT is required on arm64; retrieve it to check its presence
         * and carry out revision and ACPI HW reduced compliancy tests
         */
-       status = acpi_get_table_with_size(ACPI_SIG_FADT, 0, &table, &tbl_size);
+       status = acpi_get_table(ACPI_SIG_FADT, 0, &table);
        if (ACPI_FAILURE(status)) {
                const char *msg = acpi_format_exception(status);
 
@@ -170,10 +169,10 @@ static int __init acpi_fadt_sanity_check(void)
 
 out:
        /*
-        * acpi_get_table_with_size() creates FADT table mapping that
+        * acpi_get_table() creates FADT table mapping that
         * should be released after parsing and before resuming boot
         */
-       early_acpi_os_unmap_memory(table, tbl_size);
+       acpi_put_table(table);
        return ret;
 }
 
index 7dd527f8ca1d24b10915c865dc3f24e4a8e34b92..94be8a8e6c082cbe5b808b049187db0657ad5cb0 100644 (file)
@@ -166,6 +166,12 @@ acpi_tb_install_table_with_override(struct acpi_table_desc *new_table_desc,
 
 acpi_status acpi_tb_parse_root_table(acpi_physical_address rsdp_address);
 
+acpi_status
+acpi_tb_get_table(struct acpi_table_desc *table_desc,
+                 struct acpi_table_header **out_table);
+
+void acpi_tb_put_table(struct acpi_table_desc *table_desc);
+
 /*
  * tbxfload
  */
index 5fb838e592dc430c49b657ce6fba3dce1572676f..81473a4880ce219febb9024515cc92759362d426 100644 (file)
@@ -311,6 +311,8 @@ void acpi_tb_parse_fadt(void)
 {
        u32 length;
        struct acpi_table_header *table;
+       struct acpi_table_desc *fadt_desc;
+       acpi_status status;
 
        /*
         * The FADT has multiple versions with different lengths,
@@ -319,14 +321,12 @@ void acpi_tb_parse_fadt(void)
         * Get a local copy of the FADT and convert it to a common format
         * Map entire FADT, assumed to be smaller than one page.
         */
-       length = acpi_gbl_root_table_list.tables[acpi_gbl_fadt_index].length;
-
-       table =
-           acpi_os_map_memory(acpi_gbl_root_table_list.
-                              tables[acpi_gbl_fadt_index].address, length);
-       if (!table) {
+       fadt_desc = &acpi_gbl_root_table_list.tables[acpi_gbl_fadt_index];
+       status = acpi_tb_get_table(fadt_desc, &table);
+       if (ACPI_FAILURE(status)) {
                return;
        }
+       length = fadt_desc->length;
 
        /*
         * Validate the FADT checksum before we copy the table. Ignore
@@ -340,7 +340,7 @@ void acpi_tb_parse_fadt(void)
 
        /* All done with the real FADT, unmap it */
 
-       acpi_os_unmap_memory(table, length);
+       acpi_tb_put_table(fadt_desc);
 
        /* Obtain the DSDT and FACS tables via their addresses within the FADT */
 
index 51eb07cf989844842b6dce634a589d1e7440e154..86854e84680056e164c6adad591ad772e85a3e79 100644 (file)
@@ -381,3 +381,88 @@ next_table:
        acpi_os_unmap_memory(table, length);
        return_ACPI_STATUS(AE_OK);
 }
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_tb_get_table
+ *
+ * PARAMETERS:  table_desc          - Table descriptor
+ *              out_table           - Where the pointer to the table is returned
+ *
+ * RETURN:      Status and pointer to the requested table
+ *
+ * DESCRIPTION: Increase a reference to a table descriptor and return the
+ *              validated table pointer.
+ *              If the table descriptor is an entry of the root table list,
+ *              this API must be invoked with ACPI_MTX_TABLES acquired.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_tb_get_table(struct acpi_table_desc *table_desc,
+                 struct acpi_table_header **out_table)
+{
+       acpi_status status;
+
+       ACPI_FUNCTION_TRACE(acpi_tb_get_table);
+
+       if (table_desc->validation_count == 0) {
+
+               /* Table need to be "VALIDATED" */
+
+               status = acpi_tb_validate_table(table_desc);
+               if (ACPI_FAILURE(status)) {
+                       return_ACPI_STATUS(status);
+               }
+       }
+
+       table_desc->validation_count++;
+       if (table_desc->validation_count == 0) {
+               ACPI_ERROR((AE_INFO,
+                           "Table %p, Validation count is zero after increment\n",
+                           table_desc));
+               table_desc->validation_count--;
+               return_ACPI_STATUS(AE_LIMIT);
+       }
+
+       *out_table = table_desc->pointer;
+       return_ACPI_STATUS(AE_OK);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_tb_put_table
+ *
+ * PARAMETERS:  table_desc          - Table descriptor
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Decrease a reference to a table descriptor and release the
+ *              validated table pointer if no references.
+ *              If the table descriptor is an entry of the root table list,
+ *              this API must be invoked with ACPI_MTX_TABLES acquired.
+ *
+ ******************************************************************************/
+
+void acpi_tb_put_table(struct acpi_table_desc *table_desc)
+{
+
+       ACPI_FUNCTION_TRACE(acpi_tb_put_table);
+
+       if (table_desc->validation_count == 0) {
+               ACPI_WARNING((AE_INFO,
+                             "Table %p, Validation count is zero before decrement\n",
+                             table_desc));
+               return_VOID;
+       }
+       table_desc->validation_count--;
+
+       if (table_desc->validation_count == 0) {
+
+               /* Table need to be "INVALIDATED" */
+
+               acpi_tb_invalidate_table(table_desc);
+       }
+
+       return_VOID;
+}
index d5adb7ac468430c82c4c1d7a1d7c75be6be40c5e..7684707b254b93cf7b7c9aa90ef3346d50609ee7 100644 (file)
@@ -282,7 +282,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_table_header)
 
 /*******************************************************************************
  *
- * FUNCTION:    acpi_get_table_with_size
+ * FUNCTION:    acpi_get_table
  *
  * PARAMETERS:  signature           - ACPI signature of needed table
  *              instance            - Which instance (for SSDTs)
@@ -292,16 +292,21 @@ ACPI_EXPORT_SYMBOL(acpi_get_table_header)
  *
  * DESCRIPTION: Finds and verifies an ACPI table. Table must be in the
  *              RSDT/XSDT.
+ *              Note that an early stage acpi_get_table() call must be paired
+ *              with an early stage acpi_put_table() call. otherwise the table
+ *              pointer mapped by the early stage mapping implementation may be
+ *              erroneously unmapped by the late stage unmapping implementation
+ *              in an acpi_put_table() invoked during the late stage.
  *
  ******************************************************************************/
 acpi_status
-acpi_get_table_with_size(char *signature,
-              u32 instance, struct acpi_table_header **out_table,
-              acpi_size *tbl_size)
+acpi_get_table(char *signature,
+              u32 instance, struct acpi_table_header ** out_table)
 {
        u32 i;
        u32 j;
-       acpi_status status;
+       acpi_status status = AE_NOT_FOUND;
+       struct acpi_table_desc *table_desc;
 
        /* Parameter validation */
 
@@ -309,13 +314,22 @@ acpi_get_table_with_size(char *signature,
                return (AE_BAD_PARAMETER);
        }
 
+       /*
+        * Note that the following line is required by some OSPMs, they only
+        * check if the returned table is NULL instead of the returned status
+        * to determined if this function is succeeded.
+        */
+       *out_table = NULL;
+
+       (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
+
        /* Walk the root table list */
 
        for (i = 0, j = 0; i < acpi_gbl_root_table_list.current_table_count;
             i++) {
-               if (!ACPI_COMPARE_NAME
-                   (&(acpi_gbl_root_table_list.tables[i].signature),
-                    signature)) {
+               table_desc = &acpi_gbl_root_table_list.tables[i];
+
+               if (!ACPI_COMPARE_NAME(&table_desc->signature, signature)) {
                        continue;
                }
 
@@ -323,43 +337,65 @@ acpi_get_table_with_size(char *signature,
                        continue;
                }
 
-               status =
-                   acpi_tb_validate_table(&acpi_gbl_root_table_list.tables[i]);
-               if (ACPI_SUCCESS(status)) {
-                       *out_table = acpi_gbl_root_table_list.tables[i].pointer;
-                       *tbl_size = acpi_gbl_root_table_list.tables[i].length;
-               }
-
-               if (!acpi_gbl_permanent_mmap) {
-                       acpi_gbl_root_table_list.tables[i].pointer = NULL;
-               }
-
-               return (status);
+               status = acpi_tb_get_table(table_desc, out_table);
+               break;
        }
 
-       return (AE_NOT_FOUND);
+       (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
+       return (status);
 }
 
-ACPI_EXPORT_SYMBOL(acpi_get_table_with_size)
+ACPI_EXPORT_SYMBOL(acpi_get_table)
 
-acpi_status
-acpi_get_table(char *signature,
-              u32 instance, struct acpi_table_header **out_table)
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_put_table
+ *
+ * PARAMETERS:  table               - The pointer to the table
+ *
+ * RETURN:      None
+ *
+ * DESCRIPTION: Release a table returned by acpi_get_table() and its clones.
+ *              Note that it is not safe if this function was invoked after an
+ *              uninstallation happened to the original table descriptor.
+ *              Currently there is no OSPMs' requirement to handle such
+ *              situations.
+ *
+ ******************************************************************************/
+void acpi_put_table(struct acpi_table_header *table)
 {
-       acpi_size tbl_size;
+       u32 i;
+       struct acpi_table_desc *table_desc;
+
+       ACPI_FUNCTION_TRACE(acpi_put_table);
+
+       (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
+
+       /* Walk the root table list */
+
+       for (i = 0; i < acpi_gbl_root_table_list.current_table_count; i++) {
+               table_desc = &acpi_gbl_root_table_list.tables[i];
 
-       return acpi_get_table_with_size(signature,
-                      instance, out_table, &tbl_size);
+               if (table_desc->pointer != table) {
+                       continue;
+               }
+
+               acpi_tb_put_table(table_desc);
+               break;
+       }
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
+       return_VOID;
 }
 
-ACPI_EXPORT_SYMBOL(acpi_get_table)
+ACPI_EXPORT_SYMBOL(acpi_put_table)
 
 /*******************************************************************************
  *
  * FUNCTION:    acpi_get_table_by_index
  *
  * PARAMETERS:  table_index         - Table index
- *              table               - Where the pointer to the table is returned
+ *              out_table           - Where the pointer to the table is returned
  *
  * RETURN:      Status and pointer to the requested table
  *
@@ -368,7 +404,7 @@ ACPI_EXPORT_SYMBOL(acpi_get_table)
  *
  ******************************************************************************/
 acpi_status
-acpi_get_table_by_index(u32 table_index, struct acpi_table_header **table)
+acpi_get_table_by_index(u32 table_index, struct acpi_table_header **out_table)
 {
        acpi_status status;
 
@@ -376,35 +412,33 @@ acpi_get_table_by_index(u32 table_index, struct acpi_table_header **table)
 
        /* Parameter validation */
 
-       if (!table) {
+       if (!out_table) {
                return_ACPI_STATUS(AE_BAD_PARAMETER);
        }
 
+       /*
+        * Note that the following line is required by some OSPMs, they only
+        * check if the returned table is NULL instead of the returned status
+        * to determined if this function is succeeded.
+        */
+       *out_table = NULL;
+
        (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
 
        /* Validate index */
 
        if (table_index >= acpi_gbl_root_table_list.current_table_count) {
-               (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
-               return_ACPI_STATUS(AE_BAD_PARAMETER);
+               status = AE_BAD_PARAMETER;
+               goto unlock_and_exit;
        }
 
-       if (!acpi_gbl_root_table_list.tables[table_index].pointer) {
-
-               /* Table is not mapped, map it */
+       status =
+           acpi_tb_get_table(&acpi_gbl_root_table_list.tables[table_index],
+                             out_table);
 
-               status =
-                   acpi_tb_validate_table(&acpi_gbl_root_table_list.
-                                          tables[table_index]);
-               if (ACPI_FAILURE(status)) {
-                       (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
-                       return_ACPI_STATUS(status);
-               }
-       }
-
-       *table = acpi_gbl_root_table_list.tables[table_index].pointer;
+unlock_and_exit:
        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
-       return_ACPI_STATUS(AE_OK);
+       return_ACPI_STATUS(status);
 }
 
 ACPI_EXPORT_SYMBOL(acpi_get_table_by_index)
index 5cbefd7621f01174ff1c3ba3012d9c193dbc1e49..95855cb9d6fb772634e2dd6f683c62a1de819ffd 100644 (file)
@@ -974,7 +974,7 @@ void __init acpi_early_init(void)
        if (!acpi_strict)
                acpi_gbl_enable_interpreter_slack = TRUE;
 
-       acpi_gbl_permanent_mmap = 1;
+       acpi_permanent_mmap = true;
 
        /*
         * If the machine falls into the DMI check table,
index 312c4b4dc363fdbc4847d3db55c0cfbfbb80f5f4..2f82b8eba360e7f369338b7d7a340060d6519f4f 100644 (file)
@@ -2806,12 +2806,13 @@ static int acpi_nfit_add(struct acpi_device *adev)
        acpi_size sz;
        int rc = 0;
 
-       status = acpi_get_table_with_size(ACPI_SIG_NFIT, 0, &tbl, &sz);
+       status = acpi_get_table(ACPI_SIG_NFIT, 0, &tbl);
        if (ACPI_FAILURE(status)) {
                /* This is ok, we could have an nvdimm hotplugged later */
                dev_dbg(dev, "failed to find NFIT at startup\n");
                return 0;
        }
+       sz = tbl->length;
 
        acpi_desc = devm_kzalloc(dev, sizeof(*acpi_desc), GFP_KERNEL);
        if (!acpi_desc)
index 9a4c6abee63e0e86a6941d19665a409d3931b301..a404ff4d71511d0a9d56ce10a238682e9ffc6073 100644 (file)
@@ -76,6 +76,7 @@ static struct workqueue_struct *kacpi_notify_wq;
 static struct workqueue_struct *kacpi_hotplug_wq;
 static bool acpi_os_initialized;
 unsigned int acpi_sci_irq = INVALID_ACPI_IRQ;
+bool acpi_permanent_mmap = false;
 
 /*
  * This list of permanent mappings is for memory that may be accessed from
@@ -306,7 +307,7 @@ static void acpi_unmap(acpi_physical_address pg_off, void __iomem *vaddr)
  * virtual address).  If not found, map it, add it to that list and return a
  * pointer to it.
  *
- * During early init (when acpi_gbl_permanent_mmap has not been set yet) this
+ * During early init (when acpi_permanent_mmap has not been set yet) this
  * routine simply calls __acpi_map_table() to get the job done.
  */
 void __iomem *__ref
@@ -322,7 +323,7 @@ acpi_os_map_iomem(acpi_physical_address phys, acpi_size size)
                return NULL;
        }
 
-       if (!acpi_gbl_permanent_mmap)
+       if (!acpi_permanent_mmap)
                return __acpi_map_table((unsigned long)phys, size);
 
        mutex_lock(&acpi_ioremap_lock);
@@ -392,7 +393,7 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map)
  * mappings, drop a reference to it and unmap it if there are no more active
  * references to it.
  *
- * During early init (when acpi_gbl_permanent_mmap has not been set yet) this
+ * During early init (when acpi_permanent_mmap has not been set yet) this
  * routine simply calls __acpi_unmap_table() to get the job done.  Since
  * __acpi_unmap_table() is an __init function, the __ref annotation is needed
  * here.
@@ -401,7 +402,7 @@ void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
 {
        struct acpi_ioremap *map;
 
-       if (!acpi_gbl_permanent_mmap) {
+       if (!acpi_permanent_mmap) {
                __acpi_unmap_table(virt, size);
                return;
        }
@@ -426,12 +427,6 @@ void __ref acpi_os_unmap_memory(void *virt, acpi_size size)
 }
 EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
 
-void __init early_acpi_os_unmap_memory(void __iomem *virt, acpi_size size)
-{
-       if (!acpi_gbl_permanent_mmap)
-               __acpi_unmap_table(virt, size);
-}
-
 int acpi_os_map_generic_address(struct acpi_generic_address *gas)
 {
        u64 addr;
index 5c78ee1860b0ad390671e8f1b1c624339f7414ed..611a5585a9024a728c71e60ada951b3a73936708 100644 (file)
@@ -154,18 +154,16 @@ static phys_cpuid_t map_madt_entry(struct acpi_table_madt *madt,
 phys_cpuid_t __init acpi_map_madt_entry(u32 acpi_id)
 {
        struct acpi_table_madt *madt = NULL;
-       acpi_size tbl_size;
        phys_cpuid_t rv;
 
-       acpi_get_table_with_size(ACPI_SIG_MADT, 0,
-                                (struct acpi_table_header **)&madt,
-                                &tbl_size);
+       acpi_get_table(ACPI_SIG_MADT, 0,
+                      (struct acpi_table_header **)&madt);
        if (!madt)
                return PHYS_CPUID_INVALID;
 
        rv = map_madt_entry(madt, 1, acpi_id, true);
 
-       early_acpi_os_unmap_memory(madt, tbl_size);
+       acpi_put_table((struct acpi_table_header *)madt);
 
        return rv;
 }
index 93b00cf4eb3922d541a43d200ce73d5d414f6c3f..45dec874ea55b820281457a3ae5de2fe1f12403c 100644 (file)
@@ -1120,9 +1120,6 @@ acpi_backlight_cap_match(acpi_handle handle, u32 level, void *context,
                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found generic backlight "
                                  "support\n"));
                *cap |= ACPI_VIDEO_BACKLIGHT;
-               if (!acpi_has_method(handle, "_BQC"))
-                       printk(KERN_WARNING FW_BUG PREFIX "No _BQC method, "
-                               "cannot determine initial brightness\n");
                /* We have backlight support, no need to scan further */
                return AE_CTRL_TERMINATE;
        }
index e8d7bc7d4da89b1d0ff8f86bbf5ebbb258a411e4..b8019c4c1d38908895b21a92a094074ca2bd5bd8 100644 (file)
@@ -33,7 +33,6 @@ int __init parse_spcr(bool earlycon)
 {
        static char opts[64];
        struct acpi_table_spcr *table;
-       acpi_size table_size;
        acpi_status status;
        char *uart;
        char *iotype;
@@ -43,9 +42,8 @@ int __init parse_spcr(bool earlycon)
        if (acpi_disabled)
                return -ENODEV;
 
-       status = acpi_get_table_with_size(ACPI_SIG_SPCR, 0,
-                                         (struct acpi_table_header **)&table,
-                                         &table_size);
+       status = acpi_get_table(ACPI_SIG_SPCR, 0,
+                               (struct acpi_table_header **)&table);
 
        if (ACPI_FAILURE(status))
                return -ENOENT;
@@ -106,6 +104,6 @@ int __init parse_spcr(bool earlycon)
        err = add_preferred_console(uart, 0, opts + strlen(uart) + 1);
 
 done:
-       early_acpi_os_unmap_memory((void __iomem *)table, table_size);
+       acpi_put_table((struct acpi_table_header *)table);
        return err;
 }
index cdd56c4657e05ff38ed8e11da59d0c37a91326d6..2604189d6cd156e5449c7dd071d63120ea000a0e 100644 (file)
@@ -333,7 +333,6 @@ acpi_table_parse_entries_array(char *id,
                         unsigned int max_entries)
 {
        struct acpi_table_header *table_header = NULL;
-       acpi_size tbl_size;
        int count;
        u32 instance = 0;
 
@@ -346,7 +345,7 @@ acpi_table_parse_entries_array(char *id,
        if (!strncmp(id, ACPI_SIG_MADT, 4))
                instance = acpi_apic_instance;
 
-       acpi_get_table_with_size(id, instance, &table_header, &tbl_size);
+       acpi_get_table(id, instance, &table_header);
        if (!table_header) {
                pr_warn("%4.4s not present\n", id);
                return -ENODEV;
@@ -355,7 +354,7 @@ acpi_table_parse_entries_array(char *id,
        count = acpi_parse_entries_array(id, table_size, table_header,
                        proc, proc_num, max_entries);
 
-       early_acpi_os_unmap_memory((char *)table_header, tbl_size);
+       acpi_put_table(table_header);
        return count;
 }
 
@@ -397,7 +396,6 @@ acpi_table_parse_madt(enum acpi_madt_type id,
 int __init acpi_table_parse(char *id, acpi_tbl_table_handler handler)
 {
        struct acpi_table_header *table = NULL;
-       acpi_size tbl_size;
 
        if (acpi_disabled)
                return -ENODEV;
@@ -406,13 +404,13 @@ int __init acpi_table_parse(char *id, acpi_tbl_table_handler handler)
                return -EINVAL;
 
        if (strncmp(id, ACPI_SIG_MADT, 4) == 0)
-               acpi_get_table_with_size(id, acpi_apic_instance, &table, &tbl_size);
+               acpi_get_table(id, acpi_apic_instance, &table);
        else
-               acpi_get_table_with_size(id, 0, &table, &tbl_size);
+               acpi_get_table(id, 0, &table);
 
        if (table) {
                handler(table);
-               early_acpi_os_unmap_memory(table, tbl_size);
+               acpi_put_table(table);
                return 0;
        } else
                return -ENODEV;
@@ -426,16 +424,15 @@ int __init acpi_table_parse(char *id, acpi_tbl_table_handler handler)
 static void __init check_multiple_madt(void)
 {
        struct acpi_table_header *table = NULL;
-       acpi_size tbl_size;
 
-       acpi_get_table_with_size(ACPI_SIG_MADT, 2, &table, &tbl_size);
+       acpi_get_table(ACPI_SIG_MADT, 2, &table);
        if (table) {
                pr_warn("BIOS bug: multiple APIC/MADT found, using %d\n",
                        acpi_apic_instance);
                pr_warn("If \"acpi_apic_instance=%d\" works better, "
                        "notify linux-acpi@vger.kernel.org\n",
                        acpi_apic_instance ? 0 : 2);
-               early_acpi_os_unmap_memory(table, tbl_size);
+               acpi_put_table(table);
 
        } else
                acpi_apic_instance = 0;
index 4f973a9c7b8714d55229b6f712522f50fcfb1fdf..8ec1967a850b86361b18535955fd161a0808f6d4 100644 (file)
@@ -305,8 +305,9 @@ static bool amdgpu_acpi_vfct_bios(struct amdgpu_device *adev)
        GOP_VBIOS_CONTENT *vbios;
        VFCT_IMAGE_HEADER *vhdr;
 
-       if (!ACPI_SUCCESS(acpi_get_table_with_size("VFCT", 1, &hdr, &tbl_size)))
+       if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
                return false;
+       tbl_size = hdr->length;
        if (tbl_size < sizeof(UEFI_ACPI_VFCT)) {
                DRM_ERROR("ACPI VFCT table present but broken (too short #1)\n");
                goto out_unmap;
index 21b6732425c50d4b368d6b0fb016ea507a8aa6a1..c829cfb02fc4c994a1167e9daa7b4c1010a97ab0 100644 (file)
@@ -603,8 +603,9 @@ static bool radeon_acpi_vfct_bios(struct radeon_device *rdev)
        GOP_VBIOS_CONTENT *vbios;
        VFCT_IMAGE_HEADER *vhdr;
 
-       if (!ACPI_SUCCESS(acpi_get_table_with_size("VFCT", 1, &hdr, &tbl_size)))
+       if (!ACPI_SUCCESS(acpi_get_table("VFCT", 1, &hdr)))
                return false;
+       tbl_size = hdr->length;
        if (tbl_size < sizeof(UEFI_ACPI_VFCT)) {
                DRM_ERROR("ACPI VFCT table present but broken (too short #1)\n");
                goto out_unmap;
index 971154cbbb03eb36efc7fb60608afe23d48f38a2..6799cf9713f77f460f990e6bc0f38b31422c0745 100644 (file)
@@ -2209,14 +2209,13 @@ static void __init free_dma_resources(void)
 static int __init early_amd_iommu_init(void)
 {
        struct acpi_table_header *ivrs_base;
-       acpi_size ivrs_size;
        acpi_status status;
        int i, remap_cache_sz, ret = 0;
 
        if (!amd_iommu_detected)
                return -ENODEV;
 
-       status = acpi_get_table_with_size("IVRS", 0, &ivrs_base, &ivrs_size);
+       status = acpi_get_table("IVRS", 0, &ivrs_base);
        if (status == AE_NOT_FOUND)
                return -ENODEV;
        else if (ACPI_FAILURE(status)) {
@@ -2338,7 +2337,7 @@ static int __init early_amd_iommu_init(void)
 
 out:
        /* Don't leak any ACPI memory */
-       early_acpi_os_unmap_memory((char __iomem *)ivrs_base, ivrs_size);
+       acpi_put_table(ivrs_base);
        ivrs_base = NULL;
 
        return ret;
@@ -2362,10 +2361,9 @@ out:
 static bool detect_ivrs(void)
 {
        struct acpi_table_header *ivrs_base;
-       acpi_size ivrs_size;
        acpi_status status;
 
-       status = acpi_get_table_with_size("IVRS", 0, &ivrs_base, &ivrs_size);
+       status = acpi_get_table("IVRS", 0, &ivrs_base);
        if (status == AE_NOT_FOUND)
                return false;
        else if (ACPI_FAILURE(status)) {
@@ -2374,7 +2372,7 @@ static bool detect_ivrs(void)
                return false;
        }
 
-       early_acpi_os_unmap_memory((char __iomem *)ivrs_base, ivrs_size);
+       acpi_put_table(ivrs_base);
 
        /* Make sure ACS will be enabled during PCI probe */
        pci_request_acs();
index 8c53748a769d447fac83622725c305a3ee6bc92f..a88576d50740b2dbdbe6e65b2bfe1985f01c81ca 100644 (file)
@@ -68,7 +68,6 @@ DECLARE_RWSEM(dmar_global_lock);
 LIST_HEAD(dmar_drhd_units);
 
 struct acpi_table_header * __initdata dmar_tbl;
-static acpi_size dmar_tbl_size;
 static int dmar_dev_scope_status = 1;
 static unsigned long dmar_seq_ids[BITS_TO_LONGS(DMAR_UNITS_SUPPORTED)];
 
@@ -543,9 +542,7 @@ static int __init dmar_table_detect(void)
        acpi_status status = AE_OK;
 
        /* if we could find DMAR table, then there are DMAR devices */
-       status = acpi_get_table_with_size(ACPI_SIG_DMAR, 0,
-                               (struct acpi_table_header **)&dmar_tbl,
-                               &dmar_tbl_size);
+       status = acpi_get_table(ACPI_SIG_DMAR, 0, &dmar_tbl);
 
        if (ACPI_SUCCESS(status) && !dmar_tbl) {
                pr_warn("Unable to map DMAR\n");
@@ -906,7 +903,7 @@ int __init detect_intel_iommu(void)
                x86_init.iommu.iommu_init = intel_iommu_init;
 #endif
 
-       early_acpi_os_unmap_memory((void __iomem *)dmar_tbl, dmar_tbl_size);
+       acpi_put_table(dmar_tbl);
        dmar_tbl = NULL;
        up_write(&dmar_global_lock);
 
index 1f32688c312d717639ecfe7de3ca94b35d31a637..dd9ecd354a3e001a1b4037f0e1ca2c92c5672957 100644 (file)
@@ -447,7 +447,6 @@ static int pcc_parse_subspace_irq(int id,
  */
 static int __init acpi_pcc_probe(void)
 {
-       acpi_size pcct_tbl_header_size;
        struct acpi_table_header *pcct_tbl;
        struct acpi_subtable_header *pcct_entry;
        struct acpi_table_pcct *acpi_pcct_tbl;
@@ -456,9 +455,7 @@ static int __init acpi_pcc_probe(void)
        acpi_status status = AE_OK;
 
        /* Search for PCCT */
-       status = acpi_get_table_with_size(ACPI_SIG_PCCT, 0,
-                       &pcct_tbl,
-                       &pcct_tbl_header_size);
+       status = acpi_get_table(ACPI_SIG_PCCT, 0, &pcct_tbl);
 
        if (ACPI_FAILURE(status) || !pcct_tbl) {
                pr_warn("PCCT header not found.\n");
index d7d0f495a34e975d7c045efab5dd029d5f393687..303315b9693fc999022b192f91b4681505f3c571 100644 (file)
@@ -13,6 +13,8 @@ static inline void __iomem *acpi_os_ioremap(acpi_physical_address phys,
 }
 #endif
 
+extern bool acpi_permanent_mmap;
+
 void __iomem *__ref
 acpi_os_map_iomem(acpi_physical_address phys, acpi_size size);
 void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size);
index 5c7356adc10b5f96f0fc39f430ae4741fbda8ea1..f5e10dd8e86b712a4c0e97a206d36ff88fabe02f 100644 (file)
@@ -513,10 +513,12 @@ ACPI_EXTERNAL_RETURN_STATUS(acpi_status
                             acpi_get_table(acpi_string signature, u32 instance,
                                            struct acpi_table_header
                                            **out_table))
+ACPI_EXTERNAL_RETURN_VOID(void acpi_put_table(struct acpi_table_header *table))
+
 ACPI_EXTERNAL_RETURN_STATUS(acpi_status
-                            acpi_get_table_by_index(u32 table_index,
-                                                    struct acpi_table_header
-                                                    **out_table))
+                           acpi_get_table_by_index(u32 table_index,
+                                                   struct acpi_table_header
+                                                   **out_table))
 ACPI_EXTERNAL_RETURN_STATUS(acpi_status
                             acpi_install_table_handler(acpi_table_handler
                                                        handler, void *context))
@@ -965,15 +967,6 @@ void acpi_terminate_debugger(void);
 /*
  * Divergences
  */
-ACPI_GLOBAL(u8, acpi_gbl_permanent_mmap);
-
-ACPI_EXTERNAL_RETURN_STATUS(acpi_status
-                           acpi_get_table_with_size(acpi_string signature,
-                                                    u32 instance,
-                                                    struct acpi_table_header
-                                                    **out_table,
-                                                    acpi_size *tbl_size))
-
 ACPI_EXTERNAL_RETURN_STATUS(acpi_status
                            acpi_get_data_full(acpi_handle object,
                                               acpi_object_handler handler,
index c19700e2a2fe25d169a64180593438d9815c3f77..da5708caf8a12493de0e52376c27b7c0bffd1378 100644 (file)
@@ -371,6 +371,7 @@ struct acpi_table_desc {
        union acpi_name_union signature;
        acpi_owner_id owner_id;
        u8 flags;
+       u16 validation_count;
 };
 
 /* Masks for Flags field above */
index a5509d87230a4778de5566f8cfe7b705a1dd89f1..7dbb1141f546077ceec4c9fe39b077ae8e1ba379 100644 (file)
@@ -142,7 +142,6 @@ static inline void acpi_os_terminate_command_signals(void)
 /*
  * OSL interfaces added by Linux
  */
-void early_acpi_os_unmap_memory(void __iomem * virt, acpi_size size);
 
 #endif                         /* __KERNEL__ */