Merge branches 'acpi-mm', 'acpi-tables', 'acpi-apei' and 'acpi-misc'
* acpi-mm: ACPI: OSL: Clean up the removal of unused memory mappings ACPI: OSL: Use deferred unmapping in acpi_os_unmap_iomem() ACPI: OSL: Use deferred unmapping in acpi_os_unmap_generic_address() ACPICA: Preserve memory opregion mappings ACPI: OSL: Implement deferred unmapping of ACPI memory * acpi-tables: ACPI: NUMA: Remove the useless 'node >= MAX_NUMNODES' check ACPI: NUMA: Remove the useless sub table pointer check ACPI: tables: Remove the duplicated checks for acpi_parse_entries_array() ACPI: tables: avoid relocations for table signature array * acpi-apei: ACPI: APEI: remove redundant assignment to variable rc * acpi-misc: ACPI: Replace HTTP links with HTTPS ones ACPI: Use valid link to the ACPI specification ACPI: Use fallthrough pseudo-keyword
This commit is contained in:
Коммит
db1da2f52e
|
@ -96,5 +96,5 @@ contents.
|
||||||
References
|
References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
.. [1] http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
|
.. [1] https://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf
|
||||||
.. [2] http://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf
|
.. [2] https://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf
|
||||||
|
|
|
@ -85,9 +85,9 @@ References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
[1] Hierarchical Data Extension UUID For _DSD.
|
[1] Hierarchical Data Extension UUID For _DSD.
|
||||||
<http://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf>,
|
<https://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf>,
|
||||||
referenced 2018-07-17.
|
referenced 2018-07-17.
|
||||||
|
|
||||||
[2] Device Properties UUID For _DSD.
|
[2] Device Properties UUID For _DSD.
|
||||||
<http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf>,
|
<https://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf>,
|
||||||
referenced 2016-10-04.
|
referenced 2016-10-04.
|
||||||
|
|
|
@ -154,23 +154,23 @@ References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
[1] _DSD (Device Specific Data) Implementation Guide.
|
[1] _DSD (Device Specific Data) Implementation Guide.
|
||||||
http://www.uefi.org/sites/default/files/resources/_DSD-implementation-guide-toplevel-1_1.htm,
|
https://www.uefi.org/sites/default/files/resources/_DSD-implementation-guide-toplevel-1_1.htm,
|
||||||
referenced 2016-10-03.
|
referenced 2016-10-03.
|
||||||
|
|
||||||
[2] Devicetree. http://www.devicetree.org, referenced 2016-10-03.
|
[2] Devicetree. https://www.devicetree.org, referenced 2016-10-03.
|
||||||
|
|
||||||
[3] Documentation/devicetree/bindings/graph.txt
|
[3] Documentation/devicetree/bindings/graph.txt
|
||||||
|
|
||||||
[4] Device Properties UUID For _DSD.
|
[4] Device Properties UUID For _DSD.
|
||||||
http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf,
|
https://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf,
|
||||||
referenced 2016-10-04.
|
referenced 2016-10-04.
|
||||||
|
|
||||||
[5] Hierarchical Data Extension UUID For _DSD.
|
[5] Hierarchical Data Extension UUID For _DSD.
|
||||||
http://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf,
|
https://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf,
|
||||||
referenced 2016-10-04.
|
referenced 2016-10-04.
|
||||||
|
|
||||||
[6] Advanced Configuration and Power Interface Specification.
|
[6] Advanced Configuration and Power Interface Specification.
|
||||||
http://www.uefi.org/sites/default/files/resources/ACPI_6_1.pdf,
|
https://www.uefi.org/sites/default/files/resources/ACPI_6_1.pdf,
|
||||||
referenced 2016-10-04.
|
referenced 2016-10-04.
|
||||||
|
|
||||||
[7] _DSD Device Properties Usage Rules.
|
[7] _DSD Device Properties Usage Rules.
|
||||||
|
|
|
@ -90,7 +90,7 @@ where
|
||||||
References
|
References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
[1] Device tree. <URL:http://www.devicetree.org>, referenced 2019-02-21.
|
[1] Device tree. <URL:https://www.devicetree.org>, referenced 2019-02-21.
|
||||||
|
|
||||||
[2] Advanced Configuration and Power Interface Specification.
|
[2] Advanced Configuration and Power Interface Specification.
|
||||||
<URL:https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf>,
|
<URL:https://uefi.org/sites/default/files/resources/ACPI_6_3_final_Jan30.pdf>,
|
||||||
|
@ -101,11 +101,11 @@ References
|
||||||
[4] Documentation/devicetree/bindings/media/video-interfaces.txt
|
[4] Documentation/devicetree/bindings/media/video-interfaces.txt
|
||||||
|
|
||||||
[5] Device Properties UUID For _DSD.
|
[5] Device Properties UUID For _DSD.
|
||||||
<URL:http://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf>,
|
<URL:https://www.uefi.org/sites/default/files/resources/_DSD-device-properties-UUID.pdf>,
|
||||||
referenced 2019-02-21.
|
referenced 2019-02-21.
|
||||||
|
|
||||||
[6] Hierarchical Data Extension UUID For _DSD.
|
[6] Hierarchical Data Extension UUID For _DSD.
|
||||||
<URL:http://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf>,
|
<URL:https://www.uefi.org/sites/default/files/resources/_DSD-hierarchical-data-extension-UUID-v1.1.pdf>,
|
||||||
referenced 2019-02-21.
|
referenced 2019-02-21.
|
||||||
|
|
||||||
[7] Documentation/firmware-guide/acpi/dsd/data-node-references.rst
|
[7] Documentation/firmware-guide/acpi/dsd/data-node-references.rst
|
||||||
|
|
|
@ -7,7 +7,7 @@ Low Power Idle Table (LPIT)
|
||||||
To enumerate platform Low Power Idle states, Intel platforms are using
|
To enumerate platform Low Power Idle states, Intel platforms are using
|
||||||
“Low Power Idle Table” (LPIT). More details about this table can be
|
“Low Power Idle Table” (LPIT). More details about this table can be
|
||||||
downloaded from:
|
downloaded from:
|
||||||
http://www.uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf
|
https://www.uefi.org/sites/default/files/resources/Intel_ACPI_Low_Power_S0_Idle.pdf
|
||||||
|
|
||||||
Residencies for each low power state can be read via FFH
|
Residencies for each low power state can be read via FFH
|
||||||
(Function fixed hardware) or a memory mapped interface.
|
(Function fixed hardware) or a memory mapped interface.
|
||||||
|
|
|
@ -9,7 +9,7 @@ Supported systems:
|
||||||
|
|
||||||
Prefix: 'power_meter'
|
Prefix: 'power_meter'
|
||||||
|
|
||||||
Datasheet: http://acpi.info/, section 10.4.
|
Datasheet: https://uefi.org/specifications, section 10.4.
|
||||||
|
|
||||||
Author: Darrick J. Wong
|
Author: Darrick J. Wong
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ menuconfig ACPI
|
||||||
Linux support for ACPI is based on Intel Corporation's ACPI
|
Linux support for ACPI is based on Intel Corporation's ACPI
|
||||||
Component Architecture (ACPI CA). For more information on the
|
Component Architecture (ACPI CA). For more information on the
|
||||||
ACPI CA, see:
|
ACPI CA, see:
|
||||||
<http://acpica.org/>
|
<https://acpica.org/>
|
||||||
|
|
||||||
ACPI is an open industry specification originally co-developed by
|
ACPI is an open industry specification originally co-developed by
|
||||||
Hewlett-Packard, Intel, Microsoft, Phoenix, and Toshiba. Currently,
|
Hewlett-Packard, Intel, Microsoft, Phoenix, and Toshiba. Currently,
|
||||||
|
@ -40,8 +40,7 @@ menuconfig ACPI
|
||||||
the UEFI Forum and any UEFI member can join the ASWG and contribute
|
the UEFI Forum and any UEFI member can join the ASWG and contribute
|
||||||
to the ACPI specification.
|
to the ACPI specification.
|
||||||
The specification is available at:
|
The specification is available at:
|
||||||
<http://www.acpi.info>
|
<https://uefi.org/specifications>
|
||||||
<http://www.uefi.org/acpi/specs>
|
|
||||||
|
|
||||||
if ACPI
|
if ACPI
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,7 @@ static void acpi_ac_notify(struct acpi_device *device, u32 event)
|
||||||
default:
|
default:
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
"Unsupported event [0x%x]\n", event));
|
"Unsupported event [0x%x]\n", event));
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case ACPI_AC_NOTIFY_STATUS:
|
case ACPI_AC_NOTIFY_STATUS:
|
||||||
case ACPI_NOTIFY_BUS_CHECK:
|
case ACPI_NOTIFY_BUS_CHECK:
|
||||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||||
|
|
|
@ -79,7 +79,7 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev)
|
||||||
* PIIX4 models.
|
* PIIX4 models.
|
||||||
*/
|
*/
|
||||||
errata.piix4.throttle = 1;
|
errata.piix4.throttle = 1;
|
||||||
/* fall through*/
|
fallthrough;
|
||||||
|
|
||||||
case 2: /* PIIX4E */
|
case 2: /* PIIX4E */
|
||||||
case 3: /* PIIX4M */
|
case 3: /* PIIX4M */
|
||||||
|
|
|
@ -38,6 +38,7 @@ acpi_ev_system_memory_region_setup(acpi_handle handle,
|
||||||
union acpi_operand_object *region_desc =
|
union acpi_operand_object *region_desc =
|
||||||
(union acpi_operand_object *)handle;
|
(union acpi_operand_object *)handle;
|
||||||
struct acpi_mem_space_context *local_region_context;
|
struct acpi_mem_space_context *local_region_context;
|
||||||
|
struct acpi_mem_mapping *mm;
|
||||||
|
|
||||||
ACPI_FUNCTION_TRACE(ev_system_memory_region_setup);
|
ACPI_FUNCTION_TRACE(ev_system_memory_region_setup);
|
||||||
|
|
||||||
|
@ -46,13 +47,14 @@ acpi_ev_system_memory_region_setup(acpi_handle handle,
|
||||||
local_region_context =
|
local_region_context =
|
||||||
(struct acpi_mem_space_context *)*region_context;
|
(struct acpi_mem_space_context *)*region_context;
|
||||||
|
|
||||||
/* Delete a cached mapping if present */
|
/* Delete memory mappings if present */
|
||||||
|
|
||||||
if (local_region_context->mapped_length) {
|
while (local_region_context->first_mm) {
|
||||||
acpi_os_unmap_memory(local_region_context->
|
mm = local_region_context->first_mm;
|
||||||
mapped_logical_address,
|
local_region_context->first_mm = mm->next_mm;
|
||||||
local_region_context->
|
acpi_os_unmap_memory(mm->logical_address,
|
||||||
mapped_length);
|
mm->length);
|
||||||
|
ACPI_FREE(mm);
|
||||||
}
|
}
|
||||||
ACPI_FREE(local_region_context);
|
ACPI_FREE(local_region_context);
|
||||||
*region_context = NULL;
|
*region_context = NULL;
|
||||||
|
|
|
@ -41,6 +41,7 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||||
acpi_status status = AE_OK;
|
acpi_status status = AE_OK;
|
||||||
void *logical_addr_ptr = NULL;
|
void *logical_addr_ptr = NULL;
|
||||||
struct acpi_mem_space_context *mem_info = region_context;
|
struct acpi_mem_space_context *mem_info = region_context;
|
||||||
|
struct acpi_mem_mapping *mm = mem_info->cur_mm;
|
||||||
u32 length;
|
u32 length;
|
||||||
acpi_size map_length;
|
acpi_size map_length;
|
||||||
acpi_size page_boundary_map_length;
|
acpi_size page_boundary_map_length;
|
||||||
|
@ -96,20 +97,37 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||||
* Is 1) Address below the current mapping? OR
|
* Is 1) Address below the current mapping? OR
|
||||||
* 2) Address beyond the current mapping?
|
* 2) Address beyond the current mapping?
|
||||||
*/
|
*/
|
||||||
if ((address < mem_info->mapped_physical_address) ||
|
if (!mm || (address < mm->physical_address) ||
|
||||||
(((u64) address + length) > ((u64)
|
((u64) address + length > (u64) mm->physical_address + mm->length)) {
|
||||||
mem_info->mapped_physical_address +
|
|
||||||
mem_info->mapped_length))) {
|
|
||||||
/*
|
/*
|
||||||
* The request cannot be resolved by the current memory mapping;
|
* The request cannot be resolved by the current memory mapping.
|
||||||
* Delete the existing mapping and create a new one.
|
*
|
||||||
|
* Look for an existing saved mapping covering the address range
|
||||||
|
* at hand. If found, save it as the current one and carry out
|
||||||
|
* the access.
|
||||||
*/
|
*/
|
||||||
if (mem_info->mapped_length) {
|
for (mm = mem_info->first_mm; mm; mm = mm->next_mm) {
|
||||||
|
if (mm == mem_info->cur_mm)
|
||||||
|
continue;
|
||||||
|
|
||||||
/* Valid mapping, delete it */
|
if (address < mm->physical_address)
|
||||||
|
continue;
|
||||||
|
|
||||||
acpi_os_unmap_memory(mem_info->mapped_logical_address,
|
if ((u64) address + length >
|
||||||
mem_info->mapped_length);
|
(u64) mm->physical_address + mm->length)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
mem_info->cur_mm = mm;
|
||||||
|
goto access;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create a new mappings list entry */
|
||||||
|
mm = ACPI_ALLOCATE_ZEROED(sizeof(*mm));
|
||||||
|
if (!mm) {
|
||||||
|
ACPI_ERROR((AE_INFO,
|
||||||
|
"Unable to save memory mapping at 0x%8.8X%8.8X, size %u",
|
||||||
|
ACPI_FORMAT_UINT64(address), length));
|
||||||
|
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -143,29 +161,39 @@ acpi_ex_system_memory_space_handler(u32 function,
|
||||||
|
|
||||||
/* Create a new mapping starting at the address given */
|
/* Create a new mapping starting at the address given */
|
||||||
|
|
||||||
mem_info->mapped_logical_address =
|
logical_addr_ptr = acpi_os_map_memory(address, map_length);
|
||||||
acpi_os_map_memory(address, map_length);
|
if (!logical_addr_ptr) {
|
||||||
if (!mem_info->mapped_logical_address) {
|
|
||||||
ACPI_ERROR((AE_INFO,
|
ACPI_ERROR((AE_INFO,
|
||||||
"Could not map memory at 0x%8.8X%8.8X, size %u",
|
"Could not map memory at 0x%8.8X%8.8X, size %u",
|
||||||
ACPI_FORMAT_UINT64(address),
|
ACPI_FORMAT_UINT64(address),
|
||||||
(u32)map_length));
|
(u32)map_length));
|
||||||
mem_info->mapped_length = 0;
|
ACPI_FREE(mm);
|
||||||
return_ACPI_STATUS(AE_NO_MEMORY);
|
return_ACPI_STATUS(AE_NO_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the physical address and mapping size */
|
/* Save the physical address and mapping size */
|
||||||
|
|
||||||
mem_info->mapped_physical_address = address;
|
mm->logical_address = logical_addr_ptr;
|
||||||
mem_info->mapped_length = map_length;
|
mm->physical_address = address;
|
||||||
|
mm->length = map_length;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add the new entry to the mappigs list and save it as the
|
||||||
|
* current mapping.
|
||||||
|
*/
|
||||||
|
mm->next_mm = mem_info->first_mm;
|
||||||
|
mem_info->first_mm = mm;
|
||||||
|
|
||||||
|
mem_info->cur_mm = mm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
access:
|
||||||
/*
|
/*
|
||||||
* Generate a logical pointer corresponding to the address we want to
|
* Generate a logical pointer corresponding to the address we want to
|
||||||
* access
|
* access
|
||||||
*/
|
*/
|
||||||
logical_addr_ptr = mem_info->mapped_logical_address +
|
logical_addr_ptr = mm->logical_address +
|
||||||
((u64) address - (u64) mem_info->mapped_physical_address);
|
((u64) address - (u64) mm->physical_address);
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
ACPI_DEBUG_PRINT((ACPI_DB_INFO,
|
||||||
"System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n",
|
"System-Memory (width %u) R/W %u Address=%8.8X%8.8X\n",
|
||||||
|
|
|
@ -227,7 +227,7 @@ __setup("hest_disable", setup_hest_disable);
|
||||||
void __init acpi_hest_init(void)
|
void __init acpi_hest_init(void)
|
||||||
{
|
{
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
int rc = -ENODEV;
|
int rc;
|
||||||
unsigned int ghes_count = 0;
|
unsigned int ghes_count = 0;
|
||||||
|
|
||||||
if (hest_disable) {
|
if (hest_disable) {
|
||||||
|
|
|
@ -405,7 +405,7 @@ static void acpi_button_notify(struct acpi_device *device, u32 event)
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case ACPI_FIXED_HARDWARE_EVENT:
|
case ACPI_FIXED_HARDWARE_EVENT:
|
||||||
event = ACPI_BUTTON_NOTIFY_STATUS;
|
event = ACPI_BUTTON_NOTIFY_STATUS;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case ACPI_BUTTON_NOTIFY_STATUS:
|
case ACPI_BUTTON_NOTIFY_STATUS:
|
||||||
input = button->input;
|
input = button->input;
|
||||||
if (button->type == ACPI_BUTTON_TYPE_LID) {
|
if (button->type == ACPI_BUTTON_TYPE_LID) {
|
||||||
|
|
|
@ -469,7 +469,7 @@ int dock_notify(struct acpi_device *adev, u32 event)
|
||||||
surprise_removal = 1;
|
surprise_removal = 1;
|
||||||
event = ACPI_NOTIFY_EJECT_REQUEST;
|
event = ACPI_NOTIFY_EJECT_REQUEST;
|
||||||
/* Fall back */
|
/* Fall back */
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||||
begin_undock(ds);
|
begin_undock(ds);
|
||||||
if ((immediate_undock && !(ds->flags & DOCK_IS_ATA))
|
if ((immediate_undock && !(ds->flags & DOCK_IS_ATA))
|
||||||
|
|
|
@ -106,7 +106,7 @@ static acpi_status acpi_ged_request_interrupt(struct acpi_resource *ares,
|
||||||
|
|
||||||
if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
|
if (ACPI_SUCCESS(acpi_get_handle(handle, ev_name, &evt_handle)))
|
||||||
break;
|
break;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
|
if (ACPI_SUCCESS(acpi_get_handle(handle, "_EVT", &evt_handle)))
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
/* ACPI 6.1 */
|
/* ACPI 6.1 */
|
||||||
#define UUID_NFIT_BUS "2f10e7a4-9e91-11e4-89d3-123b93f75cba"
|
#define UUID_NFIT_BUS "2f10e7a4-9e91-11e4-89d3-123b93f75cba"
|
||||||
|
|
||||||
/* http://pmem.io/documents/NVDIMM_DSM_Interface-V1.6.pdf */
|
/* https://pmem.io/documents/NVDIMM_DSM_Interface-V1.6.pdf */
|
||||||
#define UUID_NFIT_DIMM "4309ac30-0d11-11e4-9191-0800200c9a66"
|
#define UUID_NFIT_DIMM "4309ac30-0d11-11e4-9191-0800200c9a66"
|
||||||
|
|
||||||
/* https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/ */
|
/* https://github.com/HewlettPackard/hpe-nvm/blob/master/Documentation/ */
|
||||||
|
|
|
@ -230,7 +230,7 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
|
||||||
pxm &= 0xff;
|
pxm &= 0xff;
|
||||||
|
|
||||||
node = acpi_map_pxm_to_node(pxm);
|
node = acpi_map_pxm_to_node(pxm);
|
||||||
if (node == NUMA_NO_NODE || node >= MAX_NUMNODES) {
|
if (node == NUMA_NO_NODE) {
|
||||||
pr_err("SRAT: Too many proximity domains.\n");
|
pr_err("SRAT: Too many proximity domains.\n");
|
||||||
goto out_err_bad_srat;
|
goto out_err_bad_srat;
|
||||||
}
|
}
|
||||||
|
@ -291,8 +291,6 @@ acpi_parse_x2apic_affinity(union acpi_subtable_headers *header,
|
||||||
struct acpi_srat_x2apic_cpu_affinity *processor_affinity;
|
struct acpi_srat_x2apic_cpu_affinity *processor_affinity;
|
||||||
|
|
||||||
processor_affinity = (struct acpi_srat_x2apic_cpu_affinity *)header;
|
processor_affinity = (struct acpi_srat_x2apic_cpu_affinity *)header;
|
||||||
if (!processor_affinity)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
acpi_table_print_srat_entry(&header->common);
|
acpi_table_print_srat_entry(&header->common);
|
||||||
|
|
||||||
|
@ -309,8 +307,6 @@ acpi_parse_processor_affinity(union acpi_subtable_headers *header,
|
||||||
struct acpi_srat_cpu_affinity *processor_affinity;
|
struct acpi_srat_cpu_affinity *processor_affinity;
|
||||||
|
|
||||||
processor_affinity = (struct acpi_srat_cpu_affinity *)header;
|
processor_affinity = (struct acpi_srat_cpu_affinity *)header;
|
||||||
if (!processor_affinity)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
acpi_table_print_srat_entry(&header->common);
|
acpi_table_print_srat_entry(&header->common);
|
||||||
|
|
||||||
|
@ -327,8 +323,6 @@ acpi_parse_gicc_affinity(union acpi_subtable_headers *header,
|
||||||
struct acpi_srat_gicc_affinity *processor_affinity;
|
struct acpi_srat_gicc_affinity *processor_affinity;
|
||||||
|
|
||||||
processor_affinity = (struct acpi_srat_gicc_affinity *)header;
|
processor_affinity = (struct acpi_srat_gicc_affinity *)header;
|
||||||
if (!processor_affinity)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
acpi_table_print_srat_entry(&header->common);
|
acpi_table_print_srat_entry(&header->common);
|
||||||
|
|
||||||
|
@ -347,8 +341,6 @@ acpi_parse_memory_affinity(union acpi_subtable_headers * header,
|
||||||
struct acpi_srat_mem_affinity *memory_affinity;
|
struct acpi_srat_mem_affinity *memory_affinity;
|
||||||
|
|
||||||
memory_affinity = (struct acpi_srat_mem_affinity *)header;
|
memory_affinity = (struct acpi_srat_mem_affinity *)header;
|
||||||
if (!memory_affinity)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
acpi_table_print_srat_entry(&header->common);
|
acpi_table_print_srat_entry(&header->common);
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,10 @@ struct acpi_ioremap {
|
||||||
void __iomem *virt;
|
void __iomem *virt;
|
||||||
acpi_physical_address phys;
|
acpi_physical_address phys;
|
||||||
acpi_size size;
|
acpi_size size;
|
||||||
unsigned long refcount;
|
union {
|
||||||
|
unsigned long refcount;
|
||||||
|
struct rcu_work rwork;
|
||||||
|
} track;
|
||||||
};
|
};
|
||||||
|
|
||||||
static LIST_HEAD(acpi_ioremaps);
|
static LIST_HEAD(acpi_ioremaps);
|
||||||
|
@ -250,7 +253,7 @@ void __iomem *acpi_os_get_iomem(acpi_physical_address phys, unsigned int size)
|
||||||
map = acpi_map_lookup(phys, size);
|
map = acpi_map_lookup(phys, size);
|
||||||
if (map) {
|
if (map) {
|
||||||
virt = map->virt + (phys - map->phys);
|
virt = map->virt + (phys - map->phys);
|
||||||
map->refcount++;
|
map->track.refcount++;
|
||||||
}
|
}
|
||||||
mutex_unlock(&acpi_ioremap_lock);
|
mutex_unlock(&acpi_ioremap_lock);
|
||||||
return virt;
|
return virt;
|
||||||
|
@ -335,7 +338,7 @@ void __iomem __ref
|
||||||
/* Check if there's a suitable mapping already. */
|
/* Check if there's a suitable mapping already. */
|
||||||
map = acpi_map_lookup(phys, size);
|
map = acpi_map_lookup(phys, size);
|
||||||
if (map) {
|
if (map) {
|
||||||
map->refcount++;
|
map->track.refcount++;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -358,7 +361,7 @@ void __iomem __ref
|
||||||
map->virt = virt;
|
map->virt = virt;
|
||||||
map->phys = pg_off;
|
map->phys = pg_off;
|
||||||
map->size = pg_sz;
|
map->size = pg_sz;
|
||||||
map->refcount = 1;
|
map->track.refcount = 1;
|
||||||
|
|
||||||
list_add_tail_rcu(&map->list, &acpi_ioremaps);
|
list_add_tail_rcu(&map->list, &acpi_ioremaps);
|
||||||
|
|
||||||
|
@ -374,31 +377,36 @@ void *__ref acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_os_map_memory);
|
EXPORT_SYMBOL_GPL(acpi_os_map_memory);
|
||||||
|
|
||||||
/* Must be called with mutex_lock(&acpi_ioremap_lock) */
|
static void acpi_os_map_remove(struct work_struct *work)
|
||||||
static unsigned long acpi_os_drop_map_ref(struct acpi_ioremap *map)
|
|
||||||
{
|
{
|
||||||
unsigned long refcount = --map->refcount;
|
struct acpi_ioremap *map = container_of(to_rcu_work(work),
|
||||||
|
struct acpi_ioremap,
|
||||||
|
track.rwork);
|
||||||
|
|
||||||
if (!refcount)
|
|
||||||
list_del_rcu(&map->list);
|
|
||||||
return refcount;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void acpi_os_map_cleanup(struct acpi_ioremap *map)
|
|
||||||
{
|
|
||||||
synchronize_rcu_expedited();
|
|
||||||
acpi_unmap(map->phys, map->virt);
|
acpi_unmap(map->phys, map->virt);
|
||||||
kfree(map);
|
kfree(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Must be called with mutex_lock(&acpi_ioremap_lock) */
|
||||||
|
static void acpi_os_drop_map_ref(struct acpi_ioremap *map)
|
||||||
|
{
|
||||||
|
if (--map->track.refcount)
|
||||||
|
return;
|
||||||
|
|
||||||
|
list_del_rcu(&map->list);
|
||||||
|
|
||||||
|
INIT_RCU_WORK(&map->track.rwork, acpi_os_map_remove);
|
||||||
|
queue_rcu_work(system_wq, &map->track.rwork);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* acpi_os_unmap_iomem - Drop a memory mapping reference.
|
* acpi_os_unmap_iomem - Drop a memory mapping reference.
|
||||||
* @virt: Start of the address range to drop a reference to.
|
* @virt: Start of the address range to drop a reference to.
|
||||||
* @size: Size of the address range to drop a reference to.
|
* @size: Size of the address range to drop a reference to.
|
||||||
*
|
*
|
||||||
* Look up the given virtual address range in the list of existing ACPI memory
|
* Look up the given virtual address range in the list of existing ACPI memory
|
||||||
* mappings, drop a reference to it and unmap it if there are no more active
|
* mappings, drop a reference to it and if there are no more active references
|
||||||
* references to it.
|
* to it, queue it up for later removal.
|
||||||
*
|
*
|
||||||
* During early init (when acpi_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
|
* routine simply calls __acpi_unmap_table() to get the job done. Since
|
||||||
|
@ -408,7 +416,6 @@ static void acpi_os_map_cleanup(struct acpi_ioremap *map)
|
||||||
void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
|
void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
|
||||||
{
|
{
|
||||||
struct acpi_ioremap *map;
|
struct acpi_ioremap *map;
|
||||||
unsigned long refcount;
|
|
||||||
|
|
||||||
if (!acpi_permanent_mmap) {
|
if (!acpi_permanent_mmap) {
|
||||||
__acpi_unmap_table(virt, size);
|
__acpi_unmap_table(virt, size);
|
||||||
|
@ -416,23 +423,27 @@ void __ref acpi_os_unmap_iomem(void __iomem *virt, acpi_size size)
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&acpi_ioremap_lock);
|
mutex_lock(&acpi_ioremap_lock);
|
||||||
|
|
||||||
map = acpi_map_lookup_virt(virt, size);
|
map = acpi_map_lookup_virt(virt, size);
|
||||||
if (!map) {
|
if (!map) {
|
||||||
mutex_unlock(&acpi_ioremap_lock);
|
mutex_unlock(&acpi_ioremap_lock);
|
||||||
WARN(true, PREFIX "%s: bad address %p\n", __func__, virt);
|
WARN(true, PREFIX "%s: bad address %p\n", __func__, virt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
refcount = acpi_os_drop_map_ref(map);
|
acpi_os_drop_map_ref(map);
|
||||||
mutex_unlock(&acpi_ioremap_lock);
|
|
||||||
|
|
||||||
if (!refcount)
|
mutex_unlock(&acpi_ioremap_lock);
|
||||||
acpi_os_map_cleanup(map);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem);
|
EXPORT_SYMBOL_GPL(acpi_os_unmap_iomem);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* acpi_os_unmap_memory - Drop a memory mapping reference.
|
||||||
|
* @virt: Start of the address range to drop a reference to.
|
||||||
|
* @size: Size of the address range to drop a reference to.
|
||||||
|
*/
|
||||||
void __ref acpi_os_unmap_memory(void *virt, acpi_size size)
|
void __ref acpi_os_unmap_memory(void *virt, acpi_size size)
|
||||||
{
|
{
|
||||||
return acpi_os_unmap_iomem((void __iomem *)virt, size);
|
acpi_os_unmap_iomem((void __iomem *)virt, size);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
|
EXPORT_SYMBOL_GPL(acpi_os_unmap_memory);
|
||||||
|
|
||||||
|
@ -461,7 +472,6 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *gas)
|
||||||
{
|
{
|
||||||
u64 addr;
|
u64 addr;
|
||||||
struct acpi_ioremap *map;
|
struct acpi_ioremap *map;
|
||||||
unsigned long refcount;
|
|
||||||
|
|
||||||
if (gas->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
|
if (gas->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY)
|
||||||
return;
|
return;
|
||||||
|
@ -472,16 +482,15 @@ void acpi_os_unmap_generic_address(struct acpi_generic_address *gas)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mutex_lock(&acpi_ioremap_lock);
|
mutex_lock(&acpi_ioremap_lock);
|
||||||
|
|
||||||
map = acpi_map_lookup(addr, gas->bit_width / 8);
|
map = acpi_map_lookup(addr, gas->bit_width / 8);
|
||||||
if (!map) {
|
if (!map) {
|
||||||
mutex_unlock(&acpi_ioremap_lock);
|
mutex_unlock(&acpi_ioremap_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
refcount = acpi_os_drop_map_ref(map);
|
acpi_os_drop_map_ref(map);
|
||||||
mutex_unlock(&acpi_ioremap_lock);
|
|
||||||
|
|
||||||
if (!refcount)
|
mutex_unlock(&acpi_ioremap_lock);
|
||||||
acpi_os_map_cleanup(map);
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(acpi_os_unmap_generic_address);
|
EXPORT_SYMBOL(acpi_os_unmap_generic_address);
|
||||||
|
|
||||||
|
|
|
@ -203,8 +203,7 @@ static void tsc_check_state(int state)
|
||||||
*/
|
*/
|
||||||
if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
|
if (boot_cpu_has(X86_FEATURE_NONSTOP_TSC))
|
||||||
return;
|
return;
|
||||||
|
fallthrough;
|
||||||
/*FALL THROUGH*/
|
|
||||||
default:
|
default:
|
||||||
/* TSC could halt in idle, so notify users */
|
/* TSC could halt in idle, so notify users */
|
||||||
if (state > ACPI_STATE_C1)
|
if (state > ACPI_STATE_C1)
|
||||||
|
|
|
@ -373,7 +373,7 @@ unsigned int acpi_dev_get_irq_type(int triggering, int polarity)
|
||||||
case ACPI_ACTIVE_BOTH:
|
case ACPI_ACTIVE_BOTH:
|
||||||
if (triggering == ACPI_EDGE_SENSITIVE)
|
if (triggering == ACPI_EDGE_SENSITIVE)
|
||||||
return IRQ_TYPE_EDGE_BOTH;
|
return IRQ_TYPE_EDGE_BOTH;
|
||||||
/* fall through */
|
fallthrough;
|
||||||
default:
|
default:
|
||||||
return IRQ_TYPE_NONE;
|
return IRQ_TYPE_NONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -111,7 +111,7 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console)
|
||||||
table->serial_port.access_width))) {
|
table->serial_port.access_width))) {
|
||||||
default:
|
default:
|
||||||
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
|
pr_err("Unexpected SPCR Access Width. Defaulting to byte size\n");
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case 8:
|
case 8:
|
||||||
iotype = "mmio";
|
iotype = "mmio";
|
||||||
break;
|
break;
|
||||||
|
@ -128,7 +128,7 @@ int __init acpi_parse_spcr(bool enable_earlycon, bool enable_console)
|
||||||
switch (table->interface_type) {
|
switch (table->interface_type) {
|
||||||
case ACPI_DBG2_ARM_SBSA_32BIT:
|
case ACPI_DBG2_ARM_SBSA_32BIT:
|
||||||
iotype = "mmio32";
|
iotype = "mmio32";
|
||||||
/* fall through */
|
fallthrough;
|
||||||
case ACPI_DBG2_ARM_PL011:
|
case ACPI_DBG2_ARM_PL011:
|
||||||
case ACPI_DBG2_ARM_SBSA_GENERIC:
|
case ACPI_DBG2_ARM_SBSA_GENERIC:
|
||||||
case ACPI_DBG2_BCM2835:
|
case ACPI_DBG2_BCM2835:
|
||||||
|
|
|
@ -292,20 +292,6 @@ static int __init acpi_parse_entries_array(char *id, unsigned long table_size,
|
||||||
int errs = 0;
|
int errs = 0;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (acpi_disabled)
|
|
||||||
return -ENODEV;
|
|
||||||
|
|
||||||
if (!id)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (!table_size)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (!table_header) {
|
|
||||||
pr_warn("%4.4s not present\n", id);
|
|
||||||
return -ENODEV;
|
|
||||||
}
|
|
||||||
|
|
||||||
table_end = (unsigned long)table_header + table_header->length;
|
table_end = (unsigned long)table_header + table_header->length;
|
||||||
|
|
||||||
/* Parse all entries looking for a match. */
|
/* Parse all entries looking for a match. */
|
||||||
|
@ -371,6 +357,9 @@ int __init acpi_table_parse_entries_array(char *id,
|
||||||
if (!id)
|
if (!id)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!table_size)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (!strncmp(id, ACPI_SIG_MADT, 4))
|
if (!strncmp(id, ACPI_SIG_MADT, 4))
|
||||||
instance = acpi_apic_instance;
|
instance = acpi_apic_instance;
|
||||||
|
|
||||||
|
@ -490,7 +479,7 @@ static u8 __init acpi_table_checksum(u8 *buffer, u32 length)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */
|
/* All but ACPI_SIG_RSDP and ACPI_SIG_FACS: */
|
||||||
static const char * const table_sigs[] = {
|
static const char table_sigs[][ACPI_NAMESEG_SIZE] __initconst = {
|
||||||
ACPI_SIG_BERT, ACPI_SIG_BGRT, ACPI_SIG_CPEP, ACPI_SIG_ECDT,
|
ACPI_SIG_BERT, ACPI_SIG_BGRT, ACPI_SIG_CPEP, ACPI_SIG_ECDT,
|
||||||
ACPI_SIG_EINJ, ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT,
|
ACPI_SIG_EINJ, ACPI_SIG_ERST, ACPI_SIG_HEST, ACPI_SIG_MADT,
|
||||||
ACPI_SIG_MSCT, ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT,
|
ACPI_SIG_MSCT, ACPI_SIG_SBST, ACPI_SIG_SLIT, ACPI_SIG_SRAT,
|
||||||
|
@ -501,7 +490,7 @@ static const char * const table_sigs[] = {
|
||||||
ACPI_SIG_WDDT, ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT,
|
ACPI_SIG_WDDT, ACPI_SIG_WDRT, ACPI_SIG_DSDT, ACPI_SIG_FADT,
|
||||||
ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT,
|
ACPI_SIG_PSDT, ACPI_SIG_RSDT, ACPI_SIG_XSDT, ACPI_SIG_SSDT,
|
||||||
ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT,
|
ACPI_SIG_IORT, ACPI_SIG_NFIT, ACPI_SIG_HMAT, ACPI_SIG_PPTT,
|
||||||
ACPI_SIG_NHLT, NULL };
|
ACPI_SIG_NHLT };
|
||||||
|
|
||||||
#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
|
#define ACPI_HEADER_SIZE sizeof(struct acpi_table_header)
|
||||||
|
|
||||||
|
@ -548,11 +537,11 @@ void __init acpi_table_upgrade(void)
|
||||||
|
|
||||||
table = file.data;
|
table = file.data;
|
||||||
|
|
||||||
for (sig = 0; table_sigs[sig]; sig++)
|
for (sig = 0; sig < ARRAY_SIZE(table_sigs); sig++)
|
||||||
if (!memcmp(table->signature, table_sigs[sig], 4))
|
if (!memcmp(table->signature, table_sigs[sig], 4))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (!table_sigs[sig]) {
|
if (sig >= ARRAY_SIZE(table_sigs)) {
|
||||||
pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n",
|
pr_err("ACPI OVERRIDE: Unknown signature [%s%s]\n",
|
||||||
cpio_path, file.name);
|
cpio_path, file.name);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -527,8 +527,8 @@ static void program_hpx_type3_register(struct pci_dev *dev,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case HPX_CFG_VEND_CAP: /* Fall through */
|
case HPX_CFG_VEND_CAP:
|
||||||
case HPX_CFG_DVSEC: /* Fall through */
|
case HPX_CFG_DVSEC:
|
||||||
default:
|
default:
|
||||||
pci_warn(dev, "Encountered _HPX type 3 with unsupported config space location");
|
pci_warn(dev, "Encountered _HPX type 3 with unsupported config space location");
|
||||||
return;
|
return;
|
||||||
|
@ -1001,7 +1001,7 @@ static int acpi_pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||||
error = -EBUSY;
|
error = -EBUSY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/* Fall through */
|
fallthrough;
|
||||||
case PCI_D0:
|
case PCI_D0:
|
||||||
case PCI_D1:
|
case PCI_D1:
|
||||||
case PCI_D2:
|
case PCI_D2:
|
||||||
|
|
|
@ -1201,12 +1201,18 @@ struct acpi_pci_id {
|
||||||
u16 function;
|
u16 function;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct acpi_mem_mapping {
|
||||||
|
acpi_physical_address physical_address;
|
||||||
|
u8 *logical_address;
|
||||||
|
acpi_size length;
|
||||||
|
struct acpi_mem_mapping *next_mm;
|
||||||
|
};
|
||||||
|
|
||||||
struct acpi_mem_space_context {
|
struct acpi_mem_space_context {
|
||||||
u32 length;
|
u32 length;
|
||||||
acpi_physical_address address;
|
acpi_physical_address address;
|
||||||
acpi_physical_address mapped_physical_address;
|
struct acpi_mem_mapping *cur_mm;
|
||||||
u8 *mapped_logical_address;
|
struct acpi_mem_mapping *first_mm;
|
||||||
acpi_size mapped_length;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -44,7 +44,7 @@ struct tboot_acpi_generic_address {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* combines Sx info from FADT and FACS tables per ACPI 2.0+ spec
|
* combines Sx info from FADT and FACS tables per ACPI 2.0+ spec
|
||||||
* (http://www.acpi.info/)
|
* (https://uefi.org/specifications)
|
||||||
*/
|
*/
|
||||||
struct tboot_acpi_sleep_info {
|
struct tboot_acpi_sleep_info {
|
||||||
struct tboot_acpi_generic_address pm1a_cnt_blk;
|
struct tboot_acpi_generic_address pm1a_cnt_blk;
|
||||||
|
|
|
@ -75,7 +75,7 @@ By default only values of core zero are displayed. How to display settings of
|
||||||
other cores is described in the cpupower(1) manpage in the \-\-cpu option
|
other cores is described in the cpupower(1) manpage in the \-\-cpu option
|
||||||
section.
|
section.
|
||||||
.SH REFERENCES
|
.SH REFERENCES
|
||||||
http://www.acpi.info/spec.htm
|
https://uefi.org/specifications
|
||||||
.SH "FILES"
|
.SH "FILES"
|
||||||
.nf
|
.nf
|
||||||
\fI/sys/devices/system/cpu/cpu*/cpuidle/state*\fP
|
\fI/sys/devices/system/cpu/cpu*/cpuidle/state*\fP
|
||||||
|
|
Загрузка…
Ссылка в новой задаче