mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-31 04:01:48 -04:00
Merge branch 'acpi-tables'
* acpi-tables: ACPI: Rename configfs.c to acpi_configfs.c to prevent link error ACPI: add support for loading SSDTs via configfs ACPI: add support for configfs efi / ACPI: load SSTDs from EFI variables spi / ACPI: add support for ACPI reconfigure notifications i2c / ACPI: add support for ACPI reconfigure notifications ACPI: add support for ACPI reconfiguration notifiers ACPI / scan: fix enumeration (visited) flags for bus rescans ACPI / documentation: add SSDT overlays documentation ACPI: ARM64: support for ACPI_TABLE_UPGRADE ACPI / tables: introduce ARCH_HAS_ACPI_TABLE_UPGRADE ACPI / tables: move arch-specific symbol to asm/acpi.h ACPI / tables: table upgrade: refactor function definitions ACPI / tables: table upgrade: use cacheable map for tables Conflicts: arch/arm64/include/asm/acpi.h
This commit is contained in:
commit
d5f017b796
22 changed files with 972 additions and 83 deletions
|
|
@ -311,9 +311,12 @@ config ACPI_CUSTOM_DSDT
|
|||
bool
|
||||
default ACPI_CUSTOM_DSDT_FILE != ""
|
||||
|
||||
config ARCH_HAS_ACPI_TABLE_UPGRADE
|
||||
def_bool n
|
||||
|
||||
config ACPI_TABLE_UPGRADE
|
||||
bool "Allow upgrading ACPI tables via initrd"
|
||||
depends on BLK_DEV_INITRD && X86
|
||||
depends on BLK_DEV_INITRD && ARCH_HAS_ACPI_TABLE_UPGRADE
|
||||
default y
|
||||
help
|
||||
This option provides functionality to upgrade arbitrary ACPI tables
|
||||
|
|
@ -521,4 +524,12 @@ config XPOWER_PMIC_OPREGION
|
|||
|
||||
endif
|
||||
|
||||
config ACPI_CONFIGFS
|
||||
tristate "ACPI configfs support"
|
||||
select CONFIGFS_FS
|
||||
help
|
||||
Select this option to enable support for ACPI configuration from
|
||||
userspace. The configurable ACPI groups will be visible under
|
||||
/config/acpi, assuming configfs is mounted under /config.
|
||||
|
||||
endif # ACPI
|
||||
|
|
|
|||
|
|
@ -99,5 +99,6 @@ obj-$(CONFIG_ACPI_EXTLOG) += acpi_extlog.o
|
|||
obj-$(CONFIG_PMIC_OPREGION) += pmic/intel_pmic.o
|
||||
obj-$(CONFIG_CRC_PMIC_OPREGION) += pmic/intel_pmic_crc.o
|
||||
obj-$(CONFIG_XPOWER_PMIC_OPREGION) += pmic/intel_pmic_xpower.o
|
||||
obj-$(CONFIG_ACPI_CONFIGFS) += acpi_configfs.o
|
||||
|
||||
video-objs += acpi_video.o video_detect.o
|
||||
|
|
|
|||
267
drivers/acpi/acpi_configfs.c
Normal file
267
drivers/acpi/acpi_configfs.c
Normal file
|
|
@ -0,0 +1,267 @@
|
|||
/*
|
||||
* ACPI configfs support
|
||||
*
|
||||
* Copyright (c) 2016 Intel Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "ACPI configfs: " fmt
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/configfs.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
static struct config_group *acpi_table_group;
|
||||
|
||||
struct acpi_table {
|
||||
struct config_item cfg;
|
||||
struct acpi_table_header *header;
|
||||
};
|
||||
|
||||
static ssize_t acpi_table_aml_write(struct config_item *cfg,
|
||||
const void *data, size_t size)
|
||||
{
|
||||
const struct acpi_table_header *header = data;
|
||||
struct acpi_table *table;
|
||||
int ret;
|
||||
|
||||
table = container_of(cfg, struct acpi_table, cfg);
|
||||
|
||||
if (table->header) {
|
||||
pr_err("table already loaded\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
if (header->length != size) {
|
||||
pr_err("invalid table length\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (memcmp(header->signature, ACPI_SIG_SSDT, 4)) {
|
||||
pr_err("invalid table signature\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
table = container_of(cfg, struct acpi_table, cfg);
|
||||
|
||||
table->header = kmemdup(header, header->length, GFP_KERNEL);
|
||||
if (!table->header)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = acpi_load_table(table->header);
|
||||
if (ret) {
|
||||
kfree(table->header);
|
||||
table->header = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline struct acpi_table_header *get_header(struct config_item *cfg)
|
||||
{
|
||||
struct acpi_table *table = container_of(cfg, struct acpi_table, cfg);
|
||||
|
||||
if (!table->header)
|
||||
pr_err("table not loaded\n");
|
||||
|
||||
return table->header;
|
||||
}
|
||||
|
||||
static ssize_t acpi_table_aml_read(struct config_item *cfg,
|
||||
void *data, size_t size)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
if (data)
|
||||
memcpy(data, h, h->length);
|
||||
|
||||
return h->length;
|
||||
}
|
||||
|
||||
#define MAX_ACPI_TABLE_SIZE (128 * 1024)
|
||||
|
||||
CONFIGFS_BIN_ATTR(acpi_table_, aml, NULL, MAX_ACPI_TABLE_SIZE);
|
||||
|
||||
struct configfs_bin_attribute *acpi_table_bin_attrs[] = {
|
||||
&acpi_table_attr_aml,
|
||||
NULL,
|
||||
};
|
||||
|
||||
ssize_t acpi_table_signature_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%.*s\n", ACPI_NAME_SIZE, h->signature);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_length_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%d\n", h->length);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_revision_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%d\n", h->revision);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_oem_id_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%.*s\n", ACPI_OEM_ID_SIZE, h->oem_id);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_oem_table_id_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%.*s\n", ACPI_OEM_TABLE_ID_SIZE, h->oem_table_id);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_oem_revision_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%d\n", h->oem_revision);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_asl_compiler_id_show(struct config_item *cfg, char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%.*s\n", ACPI_NAME_SIZE, h->asl_compiler_id);
|
||||
}
|
||||
|
||||
ssize_t acpi_table_asl_compiler_revision_show(struct config_item *cfg,
|
||||
char *str)
|
||||
{
|
||||
struct acpi_table_header *h = get_header(cfg);
|
||||
|
||||
if (!h)
|
||||
return -EINVAL;
|
||||
|
||||
return sprintf(str, "%d\n", h->asl_compiler_revision);
|
||||
}
|
||||
|
||||
CONFIGFS_ATTR_RO(acpi_table_, signature);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, length);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, revision);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, oem_id);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, oem_table_id);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, oem_revision);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, asl_compiler_id);
|
||||
CONFIGFS_ATTR_RO(acpi_table_, asl_compiler_revision);
|
||||
|
||||
struct configfs_attribute *acpi_table_attrs[] = {
|
||||
&acpi_table_attr_signature,
|
||||
&acpi_table_attr_length,
|
||||
&acpi_table_attr_revision,
|
||||
&acpi_table_attr_oem_id,
|
||||
&acpi_table_attr_oem_table_id,
|
||||
&acpi_table_attr_oem_revision,
|
||||
&acpi_table_attr_asl_compiler_id,
|
||||
&acpi_table_attr_asl_compiler_revision,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static struct config_item_type acpi_table_type = {
|
||||
.ct_owner = THIS_MODULE,
|
||||
.ct_bin_attrs = acpi_table_bin_attrs,
|
||||
.ct_attrs = acpi_table_attrs,
|
||||
};
|
||||
|
||||
static struct config_item *acpi_table_make_item(struct config_group *group,
|
||||
const char *name)
|
||||
{
|
||||
struct acpi_table *table;
|
||||
|
||||
table = kzalloc(sizeof(*table), GFP_KERNEL);
|
||||
if (!table)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
config_item_init_type_name(&table->cfg, name, &acpi_table_type);
|
||||
return &table->cfg;
|
||||
}
|
||||
|
||||
struct configfs_group_operations acpi_table_group_ops = {
|
||||
.make_item = acpi_table_make_item,
|
||||
};
|
||||
|
||||
static struct config_item_type acpi_tables_type = {
|
||||
.ct_owner = THIS_MODULE,
|
||||
.ct_group_ops = &acpi_table_group_ops,
|
||||
};
|
||||
|
||||
static struct config_item_type acpi_root_group_type = {
|
||||
.ct_owner = THIS_MODULE,
|
||||
};
|
||||
|
||||
static struct configfs_subsystem acpi_configfs = {
|
||||
.su_group = {
|
||||
.cg_item = {
|
||||
.ci_namebuf = "acpi",
|
||||
.ci_type = &acpi_root_group_type,
|
||||
},
|
||||
},
|
||||
.su_mutex = __MUTEX_INITIALIZER(acpi_configfs.su_mutex),
|
||||
};
|
||||
|
||||
static int __init acpi_configfs_init(void)
|
||||
{
|
||||
int ret;
|
||||
struct config_group *root = &acpi_configfs.su_group;
|
||||
|
||||
config_group_init(root);
|
||||
|
||||
ret = configfs_register_subsystem(&acpi_configfs);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
acpi_table_group = configfs_register_default_group(root, "table",
|
||||
&acpi_tables_type);
|
||||
return PTR_ERR_OR_ZERO(acpi_table_group);
|
||||
}
|
||||
module_init(acpi_configfs_init);
|
||||
|
||||
static void __exit acpi_configfs_exit(void)
|
||||
{
|
||||
configfs_unregister_default_group(acpi_table_group);
|
||||
configfs_unregister_subsystem(&acpi_configfs);
|
||||
}
|
||||
module_exit(acpi_configfs_exit);
|
||||
|
||||
MODULE_AUTHOR("Octavian Purdila <[email protected]>");
|
||||
MODULE_DESCRIPTION("ACPI configfs support");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
@ -990,6 +990,13 @@ void __init acpi_subsystem_init(void)
|
|||
}
|
||||
}
|
||||
|
||||
static acpi_status acpi_bus_table_handler(u32 event, void *table, void *context)
|
||||
{
|
||||
acpi_scan_table_handler(event, table, context);
|
||||
|
||||
return acpi_sysfs_table_handler(event, table, context);
|
||||
}
|
||||
|
||||
static int __init acpi_bus_init(void)
|
||||
{
|
||||
int result;
|
||||
|
|
@ -1043,6 +1050,8 @@ static int __init acpi_bus_init(void)
|
|||
* _PDC control method may load dynamic SSDT tables,
|
||||
* and we need to install the table handler before that.
|
||||
*/
|
||||
status = acpi_install_table_handler(acpi_bus_table_handler, NULL);
|
||||
|
||||
acpi_sysfs_init();
|
||||
|
||||
acpi_early_processor_set_pdc();
|
||||
|
|
|
|||
|
|
@ -87,6 +87,9 @@ bool acpi_queue_hotplug_work(struct work_struct *work);
|
|||
void acpi_device_hotplug(struct acpi_device *adev, u32 src);
|
||||
bool acpi_scan_is_offline(struct acpi_device *adev, bool uevent);
|
||||
|
||||
acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context);
|
||||
void acpi_scan_table_handler(u32 event, void *table, void *context);
|
||||
|
||||
/* --------------------------------------------------------------------------
|
||||
Device Node Initialization / Removal
|
||||
-------------------------------------------------------------------------- */
|
||||
|
|
|
|||
|
|
@ -494,6 +494,8 @@ static void acpi_device_del(struct acpi_device *device)
|
|||
device_del(&device->dev);
|
||||
}
|
||||
|
||||
static BLOCKING_NOTIFIER_HEAD(acpi_reconfig_chain);
|
||||
|
||||
static LIST_HEAD(acpi_device_del_list);
|
||||
static DEFINE_MUTEX(acpi_device_del_lock);
|
||||
|
||||
|
|
@ -514,6 +516,9 @@ static void acpi_device_del_work_fn(struct work_struct *work_not_used)
|
|||
|
||||
mutex_unlock(&acpi_device_del_lock);
|
||||
|
||||
blocking_notifier_call_chain(&acpi_reconfig_chain,
|
||||
ACPI_RECONFIG_DEVICE_REMOVE, adev);
|
||||
|
||||
acpi_device_del(adev);
|
||||
/*
|
||||
* Drop references to all power resources that might have been
|
||||
|
|
@ -1406,7 +1411,7 @@ void acpi_init_device_object(struct acpi_device *device, acpi_handle handle,
|
|||
acpi_bus_get_flags(device);
|
||||
device->flags.match_driver = false;
|
||||
device->flags.initialized = true;
|
||||
device->flags.visited = false;
|
||||
acpi_device_clear_enumerated(device);
|
||||
device_initialize(&device->dev);
|
||||
dev_set_uevent_suppress(&device->dev, true);
|
||||
acpi_init_coherency(device);
|
||||
|
|
@ -1676,15 +1681,20 @@ static void acpi_default_enumeration(struct acpi_device *device)
|
|||
bool is_spi_i2c_slave = false;
|
||||
|
||||
/*
|
||||
* Do not enemerate SPI/I2C slaves as they will be enuerated by their
|
||||
* Do not enumerate SPI/I2C slaves as they will be enumerated by their
|
||||
* respective parents.
|
||||
*/
|
||||
INIT_LIST_HEAD(&resource_list);
|
||||
acpi_dev_get_resources(device, &resource_list, acpi_check_spi_i2c_slave,
|
||||
&is_spi_i2c_slave);
|
||||
acpi_dev_free_resource_list(&resource_list);
|
||||
if (!is_spi_i2c_slave)
|
||||
if (!is_spi_i2c_slave) {
|
||||
acpi_create_platform_device(device);
|
||||
acpi_device_set_enumerated(device);
|
||||
} else {
|
||||
blocking_notifier_call_chain(&acpi_reconfig_chain,
|
||||
ACPI_RECONFIG_DEVICE_ADD, device);
|
||||
}
|
||||
}
|
||||
|
||||
static const struct acpi_device_id generic_device_ids[] = {
|
||||
|
|
@ -1751,7 +1761,7 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|||
acpi_bus_get_status(device);
|
||||
/* Skip devices that are not present. */
|
||||
if (!acpi_device_is_present(device)) {
|
||||
device->flags.visited = false;
|
||||
acpi_device_clear_enumerated(device);
|
||||
device->flags.power_manageable = 0;
|
||||
return;
|
||||
}
|
||||
|
|
@ -1766,7 +1776,7 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|||
|
||||
device->flags.initialized = true;
|
||||
}
|
||||
device->flags.visited = false;
|
||||
|
||||
ret = acpi_scan_attach_handler(device);
|
||||
if (ret < 0)
|
||||
return;
|
||||
|
|
@ -1780,7 +1790,6 @@ static void acpi_bus_attach(struct acpi_device *device)
|
|||
if (!ret && device->pnp.type.platform_id)
|
||||
acpi_default_enumeration(device);
|
||||
}
|
||||
device->flags.visited = true;
|
||||
|
||||
ok:
|
||||
list_for_each_entry(child, &device->children, node)
|
||||
|
|
@ -1872,7 +1881,7 @@ void acpi_bus_trim(struct acpi_device *adev)
|
|||
*/
|
||||
acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
|
||||
adev->flags.initialized = false;
|
||||
adev->flags.visited = false;
|
||||
acpi_device_clear_enumerated(adev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_trim);
|
||||
|
||||
|
|
@ -1916,6 +1925,8 @@ static int acpi_bus_scan_fixed(void)
|
|||
return result < 0 ? result : 0;
|
||||
}
|
||||
|
||||
static bool acpi_scan_initialized;
|
||||
|
||||
int __init acpi_scan_init(void)
|
||||
{
|
||||
int result;
|
||||
|
|
@ -1960,6 +1971,8 @@ int __init acpi_scan_init(void)
|
|||
|
||||
acpi_update_all_gpes();
|
||||
|
||||
acpi_scan_initialized = true;
|
||||
|
||||
out:
|
||||
mutex_unlock(&acpi_scan_lock);
|
||||
return result;
|
||||
|
|
@ -2003,3 +2016,57 @@ int __init __acpi_probe_device_table(struct acpi_probe_entry *ap_head, int nr)
|
|||
|
||||
return count;
|
||||
}
|
||||
|
||||
struct acpi_table_events_work {
|
||||
struct work_struct work;
|
||||
void *table;
|
||||
u32 event;
|
||||
};
|
||||
|
||||
static void acpi_table_events_fn(struct work_struct *work)
|
||||
{
|
||||
struct acpi_table_events_work *tew;
|
||||
|
||||
tew = container_of(work, struct acpi_table_events_work, work);
|
||||
|
||||
if (tew->event == ACPI_TABLE_EVENT_LOAD) {
|
||||
acpi_scan_lock_acquire();
|
||||
acpi_bus_scan(ACPI_ROOT_OBJECT);
|
||||
acpi_scan_lock_release();
|
||||
}
|
||||
|
||||
kfree(tew);
|
||||
}
|
||||
|
||||
void acpi_scan_table_handler(u32 event, void *table, void *context)
|
||||
{
|
||||
struct acpi_table_events_work *tew;
|
||||
|
||||
if (!acpi_scan_initialized)
|
||||
return;
|
||||
|
||||
if (event != ACPI_TABLE_EVENT_LOAD)
|
||||
return;
|
||||
|
||||
tew = kmalloc(sizeof(*tew), GFP_KERNEL);
|
||||
if (!tew)
|
||||
return;
|
||||
|
||||
INIT_WORK(&tew->work, acpi_table_events_fn);
|
||||
tew->table = table;
|
||||
tew->event = event;
|
||||
|
||||
schedule_work(&tew->work);
|
||||
}
|
||||
|
||||
int acpi_reconfig_notifier_register(struct notifier_block *nb)
|
||||
{
|
||||
return blocking_notifier_chain_register(&acpi_reconfig_chain, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_reconfig_notifier_register);
|
||||
|
||||
int acpi_reconfig_notifier_unregister(struct notifier_block *nb)
|
||||
{
|
||||
return blocking_notifier_chain_unregister(&acpi_reconfig_chain, nb);
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_reconfig_notifier_unregister);
|
||||
|
|
|
|||
|
|
@ -378,8 +378,7 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
|
|||
return;
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
acpi_sysfs_table_handler(u32 event, void *table, void *context)
|
||||
acpi_status acpi_sysfs_table_handler(u32 event, void *table, void *context)
|
||||
{
|
||||
struct acpi_table_attr *table_attr;
|
||||
|
||||
|
|
@ -452,9 +451,8 @@ static int acpi_tables_sysfs_init(void)
|
|||
|
||||
kobject_uevent(tables_kobj, KOBJ_ADD);
|
||||
kobject_uevent(dynamic_tables_kobj, KOBJ_ADD);
|
||||
status = acpi_install_table_handler(acpi_sysfs_table_handler, NULL);
|
||||
|
||||
return ACPI_FAILURE(status) ? -EINVAL : 0;
|
||||
return 0;
|
||||
err_dynamic_tables:
|
||||
kobject_put(tables_kobj);
|
||||
err:
|
||||
|
|
|
|||
|
|
@ -34,6 +34,8 @@
|
|||
#include <linux/bootmem.h>
|
||||
#include <linux/earlycpio.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/initrd.h>
|
||||
#include <linux/acpi.h>
|
||||
#include "internal.h"
|
||||
|
||||
#ifdef CONFIG_ACPI_CUSTOM_DSDT
|
||||
|
|
@ -481,8 +483,10 @@ static DECLARE_BITMAP(acpi_initrd_installed, NR_ACPI_INITRD_TABLES);
|
|||
|
||||
#define MAP_CHUNK_SIZE (NR_FIX_BTMAPS << PAGE_SHIFT)
|
||||
|
||||
static void __init acpi_table_initrd_init(void *data, size_t size)
|
||||
void __init acpi_table_upgrade(void)
|
||||
{
|
||||
void *data = (void *)initrd_start;
|
||||
size_t size = initrd_end - initrd_start;
|
||||
int sig, no, table_nr = 0, total_offset = 0;
|
||||
long offset = 0;
|
||||
struct acpi_table_header *table;
|
||||
|
|
@ -540,7 +544,7 @@ static void __init acpi_table_initrd_init(void *data, size_t size)
|
|||
return;
|
||||
|
||||
acpi_tables_addr =
|
||||
memblock_find_in_range(0, max_low_pfn_mapped << PAGE_SHIFT,
|
||||
memblock_find_in_range(0, ACPI_TABLE_UPGRADE_MAX_PHYS,
|
||||
all_tables_size, PAGE_SIZE);
|
||||
if (!acpi_tables_addr) {
|
||||
WARN_ON(1);
|
||||
|
|
@ -578,10 +582,10 @@ static void __init acpi_table_initrd_init(void *data, size_t size)
|
|||
clen = size;
|
||||
if (clen > MAP_CHUNK_SIZE - slop)
|
||||
clen = MAP_CHUNK_SIZE - slop;
|
||||
dest_p = early_ioremap(dest_addr & PAGE_MASK,
|
||||
clen + slop);
|
||||
dest_p = early_memremap(dest_addr & PAGE_MASK,
|
||||
clen + slop);
|
||||
memcpy(dest_p + slop, src_p, clen);
|
||||
early_iounmap(dest_p, clen + slop);
|
||||
early_memunmap(dest_p, clen + slop);
|
||||
src_p += clen;
|
||||
dest_addr += clen;
|
||||
size -= clen;
|
||||
|
|
@ -696,10 +700,6 @@ next_table:
|
|||
}
|
||||
}
|
||||
#else
|
||||
static void __init acpi_table_initrd_init(void *data, size_t size)
|
||||
{
|
||||
}
|
||||
|
||||
static acpi_status
|
||||
acpi_table_initrd_override(struct acpi_table_header *existing_table,
|
||||
acpi_physical_address *address,
|
||||
|
|
@ -742,11 +742,6 @@ acpi_os_table_override(struct acpi_table_header *existing_table,
|
|||
return AE_OK;
|
||||
}
|
||||
|
||||
void __init early_acpi_table_init(void *data, size_t size)
|
||||
{
|
||||
acpi_table_initrd_init(data, size);
|
||||
}
|
||||
|
||||
/*
|
||||
* acpi_table_init()
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in a new issue