Skip to content

Commit

Permalink
Merge tag 'acpi-extra-4.10-rc1' of git://git.kernel.org/pub/scm/linux…
Browse files Browse the repository at this point in the history
…/kernel/git/rafael/linux-pm

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
torvalds committed Dec 22, 2016
2 parents 85ba70b + c8e008e commit 9be962d
Showing 22 changed files with 224 additions and 125 deletions.
2 changes: 1 addition & 1 deletion arch/arm64/include/asm/acpi.h
Original file line number Diff line number Diff line change
@@ -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)
{
7 changes: 3 additions & 4 deletions arch/arm64/kernel/acpi.c
Original file line number Diff line number Diff line change
@@ -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;
}

6 changes: 6 additions & 0 deletions drivers/acpi/acpica/actables.h
Original file line number Diff line number Diff line change
@@ -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
*/
14 changes: 7 additions & 7 deletions drivers/acpi/acpica/tbfadt.c
Original file line number Diff line number Diff line change
@@ -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 */

85 changes: 85 additions & 0 deletions drivers/acpi/acpica/tbutils.c
Original file line number Diff line number Diff line change
@@ -381,3 +381,88 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address)
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;
}
130 changes: 82 additions & 48 deletions drivers/acpi/acpica/tbxface.c
Original file line number Diff line number Diff line change
@@ -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,74 +292,110 @@ 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 */

if (!signature || !out_table) {
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;
}

if (++j < instance) {
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,43 +404,41 @@ 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;

ACPI_FUNCTION_TRACE(acpi_get_table_by_index);

/* 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)
2 changes: 1 addition & 1 deletion drivers/acpi/bus.c
Original file line number Diff line number Diff line change
@@ -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,
Loading

0 comments on commit 9be962d

Please sign in to comment.