ACPI updates for 6.9-rc1
- Rearrange Device Check and Bus Check notification handling in the ACPI device hotplug code to make it get the "enabled" _STA bit into account (Rafael Wysocki). - Modify acpi_processor_add() to skip processors with the "enabled" _STA bit clear, as per the specification (Rafael Wysocki). - Stop failing Device Check notification handling without a valid reason (Rafael Wysocki). - Defer enumeration of devices that depend on a device with an ACPI device ID equalt to INTC10CF to address probe ordering issues on some platforms (Wentong Wu). - Constify acpi_bus_type (Ricardo Marliere). - Make the ACPI-specific suspend-to-idle code take the Low-Power S0 Idle MSFT UUID into account on non-AMD systems (Rafael Wysocki). - Add ACPI IRQ override quirks for some new platforms (Sergey Kalinichev, Maxim Kudinov, Alexey Froloff, Sviatoslav Harasymchuk, Nicolas Haye). - Make the NFIT parsing code use acpi_evaluate_dsm_typed() (Andy Shevchenko). - Fix a memory leak in acpi_processor_power_exit() (Armin Wolf). - Make it possible to quirk the CSI-2 and MIPI DisCo for Imaging properties parsing and add a quirk for Dell XPS 9315 (Sakari Ailus). - Prevent false-positive static checker warnings from triggering by intializing some variables in the ACPI thermal code to zero (Colin Ian King). - Add DELL0501 handling to acpi_quirk_skip_serdev_enumeration() and make that function generic (Hans de Goede). - Make the ACPI backlight code handle fetching EDID that is longer than 256 bytes (Mario Limonciello). - Skip initialization of GHES_ASSIST structures for Machine Check Architecture in APEI (Avadhut Naik). - Convert several plaform drivers in the ACPI subsystem to using a remove callback that returns void (Uwe Kleine-König). - Drop the long-deprecated custom_method debugfs interface that is problematic from the security standpoint (Rafael Wysocki). - Use %pe in a couple of places in the ACPI code for easier error decoding (Onkarnath). - Fix register width information handling during system memory accesses in the ACPI CPPC library (Jarred White). - Add AMD CPPC V2 support for family 17h processors to the ACPI CPPC library (Perry Yuan). -----BEGIN PGP SIGNATURE----- iQJGBAABCAAwFiEE4fcc61cGeeHD/fCwgsRv/nhiVHEFAmXvJFISHHJqd0Byand5 c29ja2kubmV0AAoJEILEb/54YlRxtWMP/0IySac8M0jkQJrlJeIqXHhV/akwpe5H kWtuT8bZ8iiQmB+orDW+hpLhdATc2vv1XPRApnkkd9QtrLEVBBIoLrDxzUJy/tzv 0qgj2s0A1pc6gRpX1y3Wc94U3PnTzOodVpjZq6L9rGQ3enBkIU7H3CWs2LIq3VfB lUSY1dmVB2rv1MHfsoxTM6eiRYEZSAc3v8b0jpIjfaHsxdUPsqZLMPXTVzgGWfu4 ePCN1oDKX9xQkVV9/hnxBYwTSO+ySBq1jgtG2PaqRmJXIaZR/24A1tHTr2UQvTss x39WnjWIrKOwO6TfwoX8KlsdBaJeQo0biH42QQV08UIYUWfQmoUVVffZMPGrlGvV F3vPMLZADMROJhtfoD4hXIcj+Asa/uqi6lKN1mctb0akozOGlHbX4yNXq4MZS9Hj sXO9gMXgWjh5cnC/NSekcdVbLbARj2g7JWdpq1dZmgh9eaXP07/D6DcrVbcdZSHs ySb6DNNAEXPL0PgSU+cLiwRRH43C+ilVz/OMrdHxb4jSuAVDluD4hwi1IwwB4feG k0s9i0OQKAkC/9UXcJrlTFs1fE4ftZ0gYVZDiSeDDy9FUo1ZYCRhOP7yfrjoCHhH Wc7sllUKHsy1TPi3Wh3ANxUaZhviNn59rL3JPAKeX1Qjx2LB+qHS6j08/v/F3m6W Srp8VJsItb/D =Yngi -----END PGP SIGNATURE----- Merge tag 'acpi-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm Pull ACPI updates from Rafael Wysocki: "These modify the ACPI device events and processor enumeration code to take the 'enabled' _STA bit into account as mandated by the ACPI specification, convert several platform drivers to using a remove callback that returns void, add some new quirks for ACPI IRQ override and other things, address assorted issues and clean up code. Specifics: - Rearrange Device Check and Bus Check notification handling in the ACPI device hotplug code to make it get the "enabled" _STA bit into account (Rafael Wysocki) - Modify acpi_processor_add() to skip processors with the "enabled" _STA bit clear, as per the specification (Rafael Wysocki) - Stop failing Device Check notification handling without a valid reason (Rafael Wysocki) - Defer enumeration of devices that depend on a device with an ACPI device ID equalt to INTC10CF to address probe ordering issues on some platforms (Wentong Wu) - Constify acpi_bus_type (Ricardo Marliere) - Make the ACPI-specific suspend-to-idle code take the Low-Power S0 Idle MSFT UUID into account on non-AMD systems (Rafael Wysocki) - Add ACPI IRQ override quirks for some new platforms (Sergey Kalinichev, Maxim Kudinov, Alexey Froloff, Sviatoslav Harasymchuk, Nicolas Haye) - Make the NFIT parsing code use acpi_evaluate_dsm_typed() (Andy Shevchenko) - Fix a memory leak in acpi_processor_power_exit() (Armin Wolf) - Make it possible to quirk the CSI-2 and MIPI DisCo for Imaging properties parsing and add a quirk for Dell XPS 9315 (Sakari Ailus) - Prevent false-positive static checker warnings from triggering by intializing some variables in the ACPI thermal code to zero (Colin Ian King) - Add DELL0501 handling to acpi_quirk_skip_serdev_enumeration() and make that function generic (Hans de Goede) - Make the ACPI backlight code handle fetching EDID that is longer than 256 bytes (Mario Limonciello) - Skip initialization of GHES_ASSIST structures for Machine Check Architecture in APEI (Avadhut Naik) - Convert several plaform drivers in the ACPI subsystem to using a remove callback that returns void (Uwe Kleine-König) - Drop the long-deprecated custom_method debugfs interface that is problematic from the security standpoint (Rafael Wysocki) - Use %pe in a couple of places in the ACPI code for easier error decoding (Onkarnath) - Fix register width information handling during system memory accesses in the ACPI CPPC library (Jarred White) - Add AMD CPPC V2 support for family 17h processors to the ACPI CPPC library (Perry Yuan)" * tag 'acpi-6.9-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (35 commits) ACPI: resource: Use IRQ override on Maibenben X565 ACPI: CPPC: Use access_width over bit_width for system memory accesses ACPI: CPPC: enable AMD CPPC V2 support for family 17h processors ACPI: APEI: Skip initialization of GHES_ASSIST structures for Machine Check Architecture ACPI: scan: Consolidate Device Check and Bus Check notification handling ACPI: scan: Rework Device Check and Bus Check notification handling ACPI: scan: Make acpi_processor_add() check the device enabled bit ACPI: scan: Relocate acpi_bus_trim_one() ACPI: scan: Fix device check notification handling ACPI: resource: Add MAIBENBEN X577 to irq1_edge_low_force_override ACPI: pfr_update: Convert to platform remove callback returning void ACPI: pfr_telemetry: Convert to platform remove callback returning void ACPI: fan: Convert to platform remove callback returning void ACPI: GED: Convert to platform remove callback returning void ACPI: DPTF: Convert to platform remove callback returning void ACPI: AGDI: Convert to platform remove callback returning void ACPI: TAD: Convert to platform remove callback returning void ACPI: APEI: GHES: Convert to platform remove callback returning void ACPI: property: Polish ignoring bad data nodes ACPI: thermal_lib: Initialize temp_decik to zero ...
This commit is contained in:
commit
9434467959
@ -14,7 +14,6 @@ ACPI Support
|
||||
dsd/phy
|
||||
enumeration
|
||||
osi
|
||||
method-customizing
|
||||
method-tracing
|
||||
DSD-properties-rules
|
||||
debug
|
||||
|
@ -1,89 +0,0 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
=======================================
|
||||
Linux ACPI Custom Control Method How To
|
||||
=======================================
|
||||
|
||||
:Author: Zhang Rui <rui.zhang@intel.com>
|
||||
|
||||
|
||||
Linux supports customizing ACPI control methods at runtime.
|
||||
|
||||
Users can use this to:
|
||||
|
||||
1. override an existing method which may not work correctly,
|
||||
or just for debugging purposes.
|
||||
2. insert a completely new method in order to create a missing
|
||||
method such as _OFF, _ON, _STA, _INI, etc.
|
||||
|
||||
For these cases, it is far simpler to dynamically install a single
|
||||
control method rather than override the entire DSDT, because kernel
|
||||
rebuild/reboot is not needed and test result can be got in minutes.
|
||||
|
||||
.. note::
|
||||
|
||||
- Only ACPI METHOD can be overridden, any other object types like
|
||||
"Device", "OperationRegion", are not recognized. Methods
|
||||
declared inside scope operators are also not supported.
|
||||
|
||||
- The same ACPI control method can be overridden for many times,
|
||||
and it's always the latest one that used by Linux/kernel.
|
||||
|
||||
- To get the ACPI debug object output (Store (AAAA, Debug)),
|
||||
please run::
|
||||
|
||||
echo 1 > /sys/module/acpi/parameters/aml_debug_output
|
||||
|
||||
|
||||
1. override an existing method
|
||||
==============================
|
||||
a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT,
|
||||
just run "cat /sys/firmware/acpi/tables/DSDT > /tmp/dsdt.dat"
|
||||
b) disassemble the table by running "iasl -d dsdt.dat".
|
||||
c) rewrite the ASL code of the method and save it in a new file,
|
||||
d) package the new file (psr.asl) to an ACPI table format.
|
||||
Here is an example of a customized \_SB._AC._PSR method::
|
||||
|
||||
DefinitionBlock ("", "SSDT", 1, "", "", 0x20080715)
|
||||
{
|
||||
Method (\_SB_.AC._PSR, 0, NotSerialized)
|
||||
{
|
||||
Store ("In AC _PSR", Debug)
|
||||
Return (ACON)
|
||||
}
|
||||
}
|
||||
|
||||
Note that the full pathname of the method in ACPI namespace
|
||||
should be used.
|
||||
e) assemble the file to generate the AML code of the method.
|
||||
e.g. "iasl -vw 6084 psr.asl" (psr.aml is generated as a result)
|
||||
If parameter "-vw 6084" is not supported by your iASL compiler,
|
||||
please try a newer version.
|
||||
f) mount debugfs by "mount -t debugfs none /sys/kernel/debug"
|
||||
g) override the old method via the debugfs by running
|
||||
"cat /tmp/psr.aml > /sys/kernel/debug/acpi/custom_method"
|
||||
|
||||
2. insert a new method
|
||||
======================
|
||||
This is easier than overriding an existing method.
|
||||
We just need to create the ASL code of the method we want to
|
||||
insert and then follow the step c) ~ g) in section 1.
|
||||
|
||||
3. undo your changes
|
||||
====================
|
||||
The "undo" operation is not supported for a new inserted method
|
||||
right now, i.e. we can not remove a method currently.
|
||||
For an overridden method, in order to undo your changes, please
|
||||
save a copy of the method original ASL code in step c) section 1,
|
||||
and redo step c) ~ g) to override the method with the original one.
|
||||
|
||||
|
||||
.. note:: We can use a kernel with multiple custom ACPI method running,
|
||||
But each individual write to debugfs can implement a SINGLE
|
||||
method override. i.e. if we want to insert/override multiple
|
||||
ACPI methods, we need to redo step c) ~ g) for multiple times.
|
||||
|
||||
.. note:: Be aware that root can mis-use this driver to modify arbitrary
|
||||
memory and gain additional rights, if root's privileges got
|
||||
restricted (for example if root is not allowed to load additional
|
||||
modules after boot).
|
@ -20,7 +20,7 @@ bool cpc_supported_by_cpu(void)
|
||||
(boot_cpu_data.x86_model >= 0x20 && boot_cpu_data.x86_model <= 0x2f)))
|
||||
return true;
|
||||
else if (boot_cpu_data.x86 == 0x17 &&
|
||||
boot_cpu_data.x86_model >= 0x70 && boot_cpu_data.x86_model <= 0x7f)
|
||||
boot_cpu_data.x86_model >= 0x30 && boot_cpu_data.x86_model <= 0x7f)
|
||||
return true;
|
||||
return boot_cpu_has(X86_FEATURE_CPPC);
|
||||
}
|
||||
|
@ -449,20 +449,6 @@ config ACPI_HED
|
||||
which is used to report some hardware errors notified via
|
||||
SCI, mainly the corrected errors.
|
||||
|
||||
config ACPI_CUSTOM_METHOD
|
||||
tristate "Allow ACPI methods to be inserted/replaced at run time"
|
||||
depends on DEBUG_FS
|
||||
help
|
||||
This debug facility allows ACPI AML methods to be inserted and/or
|
||||
replaced without rebooting the system. For details refer to:
|
||||
Documentation/firmware-guide/acpi/method-customizing.rst.
|
||||
|
||||
NOTE: This option is security sensitive, because it allows arbitrary
|
||||
kernel memory to be written to by root (uid=0) users, allowing them
|
||||
to bypass certain security measures (e.g. if root is not allowed to
|
||||
load additional kernel modules after boot, this feature may be used
|
||||
to override that restriction).
|
||||
|
||||
config ACPI_BGRT
|
||||
bool "Boottime Graphics Resource Table support"
|
||||
depends on EFI && (X86 || ARM64)
|
||||
|
@ -101,7 +101,6 @@ obj-$(CONFIG_ACPI_SBS) += sbshc.o
|
||||
obj-$(CONFIG_ACPI_SBS) += sbs.o
|
||||
obj-$(CONFIG_ACPI_HED) += hed.o
|
||||
obj-$(CONFIG_ACPI_EC_DEBUGFS) += ec_sys.o
|
||||
obj-$(CONFIG_ACPI_CUSTOM_METHOD)+= custom_method.o
|
||||
obj-$(CONFIG_ACPI_BGRT) += bgrt.o
|
||||
obj-$(CONFIG_ACPI_CPPC_LIB) += cppc_acpi.o
|
||||
obj-$(CONFIG_ACPI_SPCR_TABLE) += spcr.o
|
||||
|
@ -161,7 +161,7 @@ static void cpufreq_add_device(const char *name)
|
||||
|
||||
pdev = platform_device_register_simple(name, PLATFORM_DEVID_NONE, NULL, 0);
|
||||
if (IS_ERR(pdev))
|
||||
pr_info("%s device creation failed: %ld\n", name, PTR_ERR(pdev));
|
||||
pr_info("%s device creation failed: %pe\n", name, pdev);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86
|
||||
@ -381,6 +381,9 @@ static int acpi_processor_add(struct acpi_device *device,
|
||||
struct device *dev;
|
||||
int result = 0;
|
||||
|
||||
if (!acpi_device_is_enabled(device))
|
||||
return -ENODEV;
|
||||
|
||||
pr = kzalloc(sizeof(struct acpi_processor), GFP_KERNEL);
|
||||
if (!pr)
|
||||
return -ENOMEM;
|
||||
|
@ -554,7 +554,7 @@ static int acpi_tad_disable_timer(struct device *dev, u32 timer_id)
|
||||
return acpi_tad_wake_set(dev, "_STV", timer_id, ACPI_TAD_WAKE_DISABLED);
|
||||
}
|
||||
|
||||
static int acpi_tad_remove(struct platform_device *pdev)
|
||||
static void acpi_tad_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
acpi_handle handle = ACPI_HANDLE(dev);
|
||||
@ -579,7 +579,6 @@ static int acpi_tad_remove(struct platform_device *pdev)
|
||||
pm_runtime_put_sync(dev);
|
||||
pm_runtime_disable(dev);
|
||||
acpi_remove_cmos_rtc_space_handler(handle);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_tad_probe(struct platform_device *pdev)
|
||||
@ -684,7 +683,7 @@ static struct platform_driver acpi_tad_driver = {
|
||||
.acpi_match_table = acpi_tad_ids,
|
||||
},
|
||||
.probe = acpi_tad_probe,
|
||||
.remove = acpi_tad_remove,
|
||||
.remove_new = acpi_tad_remove,
|
||||
};
|
||||
MODULE_DEVICE_TABLE(acpi, acpi_tad_ids);
|
||||
|
||||
|
@ -612,7 +612,7 @@ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
|
||||
|
||||
static int
|
||||
acpi_video_device_EDID(struct acpi_video_device *device,
|
||||
union acpi_object **edid, ssize_t length)
|
||||
union acpi_object **edid, int length)
|
||||
{
|
||||
int status;
|
||||
struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
|
||||
@ -625,13 +625,11 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
||||
|
||||
if (!device)
|
||||
return -ENODEV;
|
||||
if (length == 128)
|
||||
arg0.integer.value = 1;
|
||||
else if (length == 256)
|
||||
arg0.integer.value = 2;
|
||||
else
|
||||
if (!length || (length % 128))
|
||||
return -EINVAL;
|
||||
|
||||
arg0.integer.value = length / 128;
|
||||
|
||||
status = acpi_evaluate_object(device->dev->handle, "_DDC", &args, &buffer);
|
||||
if (ACPI_FAILURE(status))
|
||||
return -ENODEV;
|
||||
@ -641,7 +639,8 @@ acpi_video_device_EDID(struct acpi_video_device *device,
|
||||
if (obj && obj->type == ACPI_TYPE_BUFFER)
|
||||
*edid = obj;
|
||||
else {
|
||||
acpi_handle_info(device->dev->handle, "Invalid _DDC data\n");
|
||||
acpi_handle_debug(device->dev->handle,
|
||||
"Invalid _DDC data for length %d\n", length);
|
||||
status = -EFAULT;
|
||||
kfree(obj);
|
||||
}
|
||||
@ -1447,7 +1446,6 @@ int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
|
||||
|
||||
for (i = 0; i < video->attached_count; i++) {
|
||||
video_device = video->attached_array[i].bind_info;
|
||||
length = 256;
|
||||
|
||||
if (!video_device)
|
||||
continue;
|
||||
@ -1478,18 +1476,14 @@ int acpi_video_get_edid(struct acpi_device *device, int type, int device_id,
|
||||
continue;
|
||||
}
|
||||
|
||||
status = acpi_video_device_EDID(video_device, &buffer, length);
|
||||
|
||||
if (ACPI_FAILURE(status) || !buffer ||
|
||||
buffer->type != ACPI_TYPE_BUFFER) {
|
||||
length = 128;
|
||||
for (length = 512; length > 0; length -= 128) {
|
||||
status = acpi_video_device_EDID(video_device, &buffer,
|
||||
length);
|
||||
if (ACPI_FAILURE(status) || !buffer ||
|
||||
buffer->type != ACPI_TYPE_BUFFER) {
|
||||
continue;
|
||||
}
|
||||
if (ACPI_SUCCESS(status))
|
||||
break;
|
||||
}
|
||||
if (!length)
|
||||
continue;
|
||||
|
||||
*edid = buffer->buffer.pointer;
|
||||
return length;
|
||||
|
@ -179,7 +179,7 @@ void __init acpi_watchdog_init(void)
|
||||
pdev = platform_device_register_simple("wdat_wdt", PLATFORM_DEVID_NONE,
|
||||
resources, nresources);
|
||||
if (IS_ERR(pdev))
|
||||
pr_err("Device creation failed: %ld\n", PTR_ERR(pdev));
|
||||
pr_err("Device creation failed: %pe\n", pdev);
|
||||
|
||||
kfree(resources);
|
||||
|
||||
|
@ -1455,7 +1455,7 @@ err:
|
||||
return rc;
|
||||
}
|
||||
|
||||
static int ghes_remove(struct platform_device *ghes_dev)
|
||||
static void ghes_remove(struct platform_device *ghes_dev)
|
||||
{
|
||||
int rc;
|
||||
struct ghes *ghes;
|
||||
@ -1492,8 +1492,15 @@ static int ghes_remove(struct platform_device *ghes_dev)
|
||||
break;
|
||||
case ACPI_HEST_NOTIFY_SOFTWARE_DELEGATED:
|
||||
rc = apei_sdei_unregister_ghes(ghes);
|
||||
if (rc)
|
||||
return rc;
|
||||
if (rc) {
|
||||
/*
|
||||
* Returning early results in a resource leak, but we're
|
||||
* only here if stopping the hardware failed.
|
||||
*/
|
||||
dev_err(&ghes_dev->dev, "Failed to unregister ghes (%pe)\n",
|
||||
ERR_PTR(rc));
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
BUG();
|
||||
@ -1507,8 +1514,6 @@ static int ghes_remove(struct platform_device *ghes_dev)
|
||||
mutex_unlock(&ghes_devs_mutex);
|
||||
|
||||
kfree(ghes);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver ghes_platform_driver = {
|
||||
@ -1516,7 +1521,7 @@ static struct platform_driver ghes_platform_driver = {
|
||||
.name = "GHES",
|
||||
},
|
||||
.probe = ghes_probe,
|
||||
.remove = ghes_remove,
|
||||
.remove_new = ghes_remove,
|
||||
};
|
||||
|
||||
void __init acpi_ghes_init(void)
|
||||
|
@ -37,6 +37,20 @@ EXPORT_SYMBOL_GPL(hest_disable);
|
||||
|
||||
static struct acpi_table_hest *__read_mostly hest_tab;
|
||||
|
||||
/*
|
||||
* Since GHES_ASSIST is not supported, skip initialization of GHES_ASSIST
|
||||
* structures for MCA.
|
||||
* During HEST parsing, detected MCA error sources are cached from early
|
||||
* table entries so that the Flags and Source Id fields from these cached
|
||||
* values are then referred to in later table entries to determine if the
|
||||
* encountered GHES_ASSIST structure should be initialized.
|
||||
*/
|
||||
static struct {
|
||||
struct acpi_hest_ia_corrected *cmc;
|
||||
struct acpi_hest_ia_machine_check *mc;
|
||||
struct acpi_hest_ia_deferred_check *dmc;
|
||||
} mces;
|
||||
|
||||
static const int hest_esrc_len_tab[ACPI_HEST_TYPE_RESERVED] = {
|
||||
[ACPI_HEST_TYPE_IA32_CHECK] = -1, /* need further calculation */
|
||||
[ACPI_HEST_TYPE_IA32_CORRECTED_CHECK] = -1,
|
||||
@ -70,22 +84,54 @@ static int hest_esrc_len(struct acpi_hest_header *hest_hdr)
|
||||
cmc = (struct acpi_hest_ia_corrected *)hest_hdr;
|
||||
len = sizeof(*cmc) + cmc->num_hardware_banks *
|
||||
sizeof(struct acpi_hest_ia_error_bank);
|
||||
mces.cmc = cmc;
|
||||
} else if (hest_type == ACPI_HEST_TYPE_IA32_CHECK) {
|
||||
struct acpi_hest_ia_machine_check *mc;
|
||||
mc = (struct acpi_hest_ia_machine_check *)hest_hdr;
|
||||
len = sizeof(*mc) + mc->num_hardware_banks *
|
||||
sizeof(struct acpi_hest_ia_error_bank);
|
||||
mces.mc = mc;
|
||||
} else if (hest_type == ACPI_HEST_TYPE_IA32_DEFERRED_CHECK) {
|
||||
struct acpi_hest_ia_deferred_check *mc;
|
||||
mc = (struct acpi_hest_ia_deferred_check *)hest_hdr;
|
||||
len = sizeof(*mc) + mc->num_hardware_banks *
|
||||
sizeof(struct acpi_hest_ia_error_bank);
|
||||
mces.dmc = mc;
|
||||
}
|
||||
BUG_ON(len == -1);
|
||||
|
||||
return len;
|
||||
};
|
||||
|
||||
/*
|
||||
* GHES and GHESv2 structures share the same format, starting from
|
||||
* Source Id and ending in Error Status Block Length (inclusive).
|
||||
*/
|
||||
static bool is_ghes_assist_struct(struct acpi_hest_header *hest_hdr)
|
||||
{
|
||||
struct acpi_hest_generic *ghes;
|
||||
u16 related_source_id;
|
||||
|
||||
if (hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR &&
|
||||
hest_hdr->type != ACPI_HEST_TYPE_GENERIC_ERROR_V2)
|
||||
return false;
|
||||
|
||||
ghes = (struct acpi_hest_generic *)hest_hdr;
|
||||
related_source_id = ghes->related_source_id;
|
||||
|
||||
if (mces.cmc && mces.cmc->flags & ACPI_HEST_GHES_ASSIST &&
|
||||
related_source_id == mces.cmc->header.source_id)
|
||||
return true;
|
||||
if (mces.mc && mces.mc->flags & ACPI_HEST_GHES_ASSIST &&
|
||||
related_source_id == mces.mc->header.source_id)
|
||||
return true;
|
||||
if (mces.dmc && mces.dmc->flags & ACPI_HEST_GHES_ASSIST &&
|
||||
related_source_id == mces.dmc->header.source_id)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
typedef int (*apei_hest_func_t)(struct acpi_hest_header *hest_hdr, void *data);
|
||||
|
||||
static int apei_hest_parse(apei_hest_func_t func, void *data)
|
||||
@ -114,6 +160,11 @@ static int apei_hest_parse(apei_hest_func_t func, void *data)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (is_ghes_assist_struct(hest_hdr)) {
|
||||
hest_hdr = (void *)hest_hdr + len;
|
||||
continue;
|
||||
}
|
||||
|
||||
rc = func(hest_hdr, data);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
@ -58,7 +58,7 @@ static int agdi_probe(struct platform_device *pdev)
|
||||
return agdi_sdei_probe(pdev, adata);
|
||||
}
|
||||
|
||||
static int agdi_remove(struct platform_device *pdev)
|
||||
static void agdi_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct agdi_data *adata = dev_get_platdata(&pdev->dev);
|
||||
int err, i;
|
||||
@ -67,7 +67,7 @@ static int agdi_remove(struct platform_device *pdev)
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Failed to disable sdei-event #%d (%pe)\n",
|
||||
adata->sdei_event, ERR_PTR(err));
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
@ -81,8 +81,6 @@ static int agdi_remove(struct platform_device *pdev)
|
||||
if (err)
|
||||
dev_err(&pdev->dev, "Failed to unregister sdei-event #%d (%pe)\n",
|
||||
adata->sdei_event, ERR_PTR(err));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver agdi_driver = {
|
||||
@ -90,7 +88,7 @@ static struct platform_driver agdi_driver = {
|
||||
.name = "agdi",
|
||||
},
|
||||
.probe = agdi_probe,
|
||||
.remove = agdi_remove,
|
||||
.remove_new = agdi_remove,
|
||||
};
|
||||
|
||||
void __init acpi_agdi_init(void)
|
||||
|
@ -1097,7 +1097,7 @@ static void acpi_device_remove(struct device *dev)
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
struct bus_type acpi_bus_type = {
|
||||
const struct bus_type acpi_bus_type = {
|
||||
.name = "acpi",
|
||||
.match = acpi_bus_match,
|
||||
.probe = acpi_device_probe,
|
||||
|
@ -166,6 +166,13 @@ show_cppc_data(cppc_get_perf_caps, cppc_perf_caps, nominal_freq);
|
||||
show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, reference_perf);
|
||||
show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, wraparound_time);
|
||||
|
||||
/* Check for valid access_width, otherwise, fallback to using bit_width */
|
||||
#define GET_BIT_WIDTH(reg) ((reg)->access_width ? (8 << ((reg)->access_width - 1)) : (reg)->bit_width)
|
||||
|
||||
/* Shift and apply the mask for CPC reads/writes */
|
||||
#define MASK_VAL(reg, val) ((val) >> ((reg)->bit_offset & \
|
||||
GENMASK(((reg)->bit_width), 0)))
|
||||
|
||||
static ssize_t show_feedback_ctrs(struct kobject *kobj,
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
@ -780,6 +787,7 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
|
||||
} else if (gas_t->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) {
|
||||
if (gas_t->address) {
|
||||
void __iomem *addr;
|
||||
size_t access_width;
|
||||
|
||||
if (!osc_cpc_flexible_adr_space_confirmed) {
|
||||
pr_debug("Flexible address space capability not supported\n");
|
||||
@ -787,7 +795,8 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr)
|
||||
goto out_free;
|
||||
}
|
||||
|
||||
addr = ioremap(gas_t->address, gas_t->bit_width/8);
|
||||
access_width = GET_BIT_WIDTH(gas_t) / 8;
|
||||
addr = ioremap(gas_t->address, access_width);
|
||||
if (!addr)
|
||||
goto out_free;
|
||||
cpc_ptr->cpc_regs[i-2].sys_mem_vaddr = addr;
|
||||
@ -983,6 +992,7 @@ int __weak cpc_write_ffh(int cpunum, struct cpc_reg *reg, u64 val)
|
||||
static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
|
||||
{
|
||||
void __iomem *vaddr = NULL;
|
||||
int size;
|
||||
int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu);
|
||||
struct cpc_reg *reg = ®_res->cpc_entry.reg;
|
||||
|
||||
@ -994,7 +1004,7 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
|
||||
*val = 0;
|
||||
|
||||
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
|
||||
u32 width = 8 << (reg->access_width - 1);
|
||||
u32 width = GET_BIT_WIDTH(reg);
|
||||
u32 val_u32;
|
||||
acpi_status status;
|
||||
|
||||
@ -1018,7 +1028,9 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
|
||||
return acpi_os_read_memory((acpi_physical_address)reg->address,
|
||||
val, reg->bit_width);
|
||||
|
||||
switch (reg->bit_width) {
|
||||
size = GET_BIT_WIDTH(reg);
|
||||
|
||||
switch (size) {
|
||||
case 8:
|
||||
*val = readb_relaxed(vaddr);
|
||||
break;
|
||||
@ -1037,18 +1049,22 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
|
||||
*val = MASK_VAL(reg, *val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
|
||||
{
|
||||
int ret_val = 0;
|
||||
int size;
|
||||
void __iomem *vaddr = NULL;
|
||||
int pcc_ss_id = per_cpu(cpu_pcc_subspace_idx, cpu);
|
||||
struct cpc_reg *reg = ®_res->cpc_entry.reg;
|
||||
|
||||
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
|
||||
u32 width = 8 << (reg->access_width - 1);
|
||||
u32 width = GET_BIT_WIDTH(reg);
|
||||
acpi_status status;
|
||||
|
||||
status = acpi_os_write_port((acpi_io_address)reg->address,
|
||||
@ -1070,7 +1086,12 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
|
||||
return acpi_os_write_memory((acpi_physical_address)reg->address,
|
||||
val, reg->bit_width);
|
||||
|
||||
switch (reg->bit_width) {
|
||||
size = GET_BIT_WIDTH(reg);
|
||||
|
||||
if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY)
|
||||
val = MASK_VAL(reg, val);
|
||||
|
||||
switch (size) {
|
||||
case 8:
|
||||
writeb_relaxed(val, vaddr);
|
||||
break;
|
||||
|
@ -1,103 +0,0 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* custom_method.c - debugfs interface for customizing ACPI control method
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/uaccess.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
||||
static struct dentry *cm_dentry;
|
||||
|
||||
/* /sys/kernel/debug/acpi/custom_method */
|
||||
|
||||
static ssize_t cm_write(struct file *file, const char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
static char *buf;
|
||||
static u32 max_size;
|
||||
static u32 uncopied_bytes;
|
||||
|
||||
struct acpi_table_header table;
|
||||
acpi_status status;
|
||||
int ret;
|
||||
|
||||
ret = security_locked_down(LOCKDOWN_ACPI_TABLES);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (!(*ppos)) {
|
||||
/* parse the table header to get the table length */
|
||||
if (count <= sizeof(struct acpi_table_header))
|
||||
return -EINVAL;
|
||||
if (copy_from_user(&table, user_buf,
|
||||
sizeof(struct acpi_table_header)))
|
||||
return -EFAULT;
|
||||
uncopied_bytes = max_size = table.length;
|
||||
/* make sure the buf is not allocated */
|
||||
kfree(buf);
|
||||
buf = kzalloc(max_size, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (buf == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
if ((*ppos > max_size) ||
|
||||
(*ppos + count > max_size) ||
|
||||
(*ppos + count < count) ||
|
||||
(count > uncopied_bytes)) {
|
||||
kfree(buf);
|
||||
buf = NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (copy_from_user(buf + (*ppos), user_buf, count)) {
|
||||
kfree(buf);
|
||||
buf = NULL;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
uncopied_bytes -= count;
|
||||
*ppos += count;
|
||||
|
||||
if (!uncopied_bytes) {
|
||||
status = acpi_install_method(buf);
|
||||
kfree(buf);
|
||||
buf = NULL;
|
||||
if (ACPI_FAILURE(status))
|
||||
return -EINVAL;
|
||||
add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations cm_fops = {
|
||||
.write = cm_write,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static int __init acpi_custom_method_init(void)
|
||||
{
|
||||
cm_dentry = debugfs_create_file("custom_method", S_IWUSR,
|
||||
acpi_debugfs_dir, NULL, &cm_fops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __exit acpi_custom_method_exit(void)
|
||||
{
|
||||
debugfs_remove(cm_dentry);
|
||||
}
|
||||
|
||||
module_init(acpi_custom_method_init);
|
||||
module_exit(acpi_custom_method_exit);
|
@ -141,11 +141,9 @@ static int pch_fivr_add(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pch_fivr_remove(struct platform_device *pdev)
|
||||
static void pch_fivr_remove(struct platform_device *pdev)
|
||||
{
|
||||
sysfs_remove_group(&pdev->dev.kobj, &pch_fivr_attribute_group);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id pch_fivr_device_ids[] = {
|
||||
@ -159,7 +157,7 @@ MODULE_DEVICE_TABLE(acpi, pch_fivr_device_ids);
|
||||
|
||||
static struct platform_driver pch_fivr_driver = {
|
||||
.probe = pch_fivr_add,
|
||||
.remove = pch_fivr_remove,
|
||||
.remove_new = pch_fivr_remove,
|
||||
.driver = {
|
||||
.name = "dptf_pch_fivr",
|
||||
.acpi_match_table = pch_fivr_device_ids,
|
||||
|
@ -209,7 +209,7 @@ static int dptf_power_add(struct platform_device *pdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dptf_power_remove(struct platform_device *pdev)
|
||||
static void dptf_power_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct acpi_device *acpi_dev = platform_get_drvdata(pdev);
|
||||
|
||||
@ -221,8 +221,6 @@ static int dptf_power_remove(struct platform_device *pdev)
|
||||
sysfs_remove_group(&pdev->dev.kobj, &dptf_battery_attribute_group);
|
||||
else
|
||||
sysfs_remove_group(&pdev->dev.kobj, &dptf_power_attribute_group);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id int3407_device_ids[] = {
|
||||
@ -242,7 +240,7 @@ MODULE_DEVICE_TABLE(acpi, int3407_device_ids);
|
||||
|
||||
static struct platform_driver dptf_power_driver = {
|
||||
.probe = dptf_power_add,
|
||||
.remove = dptf_power_remove,
|
||||
.remove_new = dptf_power_remove,
|
||||
.driver = {
|
||||
.name = "dptf_power",
|
||||
.acpi_match_table = int3407_device_ids,
|
||||
|
@ -173,10 +173,9 @@ static void ged_shutdown(struct platform_device *pdev)
|
||||
}
|
||||
}
|
||||
|
||||
static int ged_remove(struct platform_device *pdev)
|
||||
static void ged_remove(struct platform_device *pdev)
|
||||
{
|
||||
ged_shutdown(pdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct acpi_device_id ged_acpi_ids[] = {
|
||||
@ -186,7 +185,7 @@ static const struct acpi_device_id ged_acpi_ids[] = {
|
||||
|
||||
static struct platform_driver ged_driver = {
|
||||
.probe = ged_probe,
|
||||
.remove = ged_remove,
|
||||
.remove_new = ged_remove,
|
||||
.shutdown = ged_shutdown,
|
||||
.driver = {
|
||||
.name = MODULE_NAME,
|
||||
|
@ -387,7 +387,7 @@ err_end:
|
||||
return result;
|
||||
}
|
||||
|
||||
static int acpi_fan_remove(struct platform_device *pdev)
|
||||
static void acpi_fan_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct acpi_fan *fan = platform_get_drvdata(pdev);
|
||||
|
||||
@ -399,8 +399,6 @@ static int acpi_fan_remove(struct platform_device *pdev)
|
||||
sysfs_remove_link(&pdev->dev.kobj, "thermal_cooling");
|
||||
sysfs_remove_link(&fan->cdev->device.kobj, "device");
|
||||
thermal_cooling_device_unregister(fan->cdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
@ -446,7 +444,7 @@ static const struct dev_pm_ops acpi_fan_pm = {
|
||||
|
||||
static struct platform_driver acpi_fan_driver = {
|
||||
.probe = acpi_fan_probe,
|
||||
.remove = acpi_fan_remove,
|
||||
.remove_new = acpi_fan_remove,
|
||||
.driver = {
|
||||
.name = "acpi-fan",
|
||||
.acpi_match_table = fan_device_ids,
|
||||
|
@ -121,6 +121,7 @@ int acpi_device_setup_files(struct acpi_device *dev);
|
||||
void acpi_device_remove_files(struct acpi_device *dev);
|
||||
void acpi_device_add_finalize(struct acpi_device *device);
|
||||
void acpi_free_pnp_ids(struct acpi_device_pnp *pnp);
|
||||
bool acpi_device_is_enabled(const struct acpi_device *adev);
|
||||
bool acpi_device_is_present(const struct acpi_device *adev);
|
||||
bool acpi_device_is_battery(struct acpi_device *adev);
|
||||
bool acpi_device_is_first_physical_node(struct acpi_device *adev,
|
||||
@ -301,5 +302,6 @@ void acpi_mipi_check_crs_csi2(acpi_handle handle);
|
||||
void acpi_mipi_scan_crs_csi2(void);
|
||||
void acpi_mipi_init_crs_csi2_swnodes(void);
|
||||
void acpi_mipi_crs_csi2_cleanup(void);
|
||||
bool acpi_graph_ignore_port(acpi_handle handle);
|
||||
|
||||
#endif /* _ACPI_INTERNAL_H_ */
|
||||
|
@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <linux/limits.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/module.h>
|
||||
@ -723,3 +724,73 @@ void acpi_mipi_crs_csi2_cleanup(void)
|
||||
list_for_each_entry_safe(csi2, csi2_tmp, &acpi_mipi_crs_csi2_list, entry)
|
||||
acpi_mipi_del_crs_csi2(csi2);
|
||||
}
|
||||
|
||||
static const struct dmi_system_id dmi_ignore_port_nodes[] = {
|
||||
{
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "XPS 9315"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
static const char *strnext(const char *s1, const char *s2)
|
||||
{
|
||||
s1 = strstr(s1, s2);
|
||||
|
||||
if (!s1)
|
||||
return NULL;
|
||||
|
||||
return s1 + strlen(s2);
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_graph_ignore_port - Tell whether a port node should be ignored
|
||||
* @handle: The ACPI handle of the node (which may be a port node)
|
||||
*
|
||||
* Return: true if a port node should be ignored and the data to that should
|
||||
* come from other sources instead (Windows ACPI definitions and
|
||||
* ipu-bridge). This is currently used to ignore bad port nodes related to IPU6
|
||||
* ("IPU?") and camera sensor devices ("LNK?") in certain Dell systems with
|
||||
* Intel VSC.
|
||||
*/
|
||||
bool acpi_graph_ignore_port(acpi_handle handle)
|
||||
{
|
||||
const char *path = NULL, *orig_path;
|
||||
static bool dmi_tested, ignore_port;
|
||||
|
||||
if (!dmi_tested) {
|
||||
ignore_port = dmi_first_match(dmi_ignore_port_nodes);
|
||||
dmi_tested = true;
|
||||
}
|
||||
|
||||
if (!ignore_port)
|
||||
return false;
|
||||
|
||||
/* Check if the device is either "IPU" or "LNK" (sensor). */
|
||||
orig_path = acpi_handle_path(handle);
|
||||
if (!orig_path)
|
||||
return false;
|
||||
path = strnext(orig_path, "IPU");
|
||||
if (!path)
|
||||
path = strnext(orig_path, "LNK");
|
||||
if (!path)
|
||||
goto out_free;
|
||||
|
||||
if (!(isdigit(path[0]) && path[1] == '.'))
|
||||
goto out_free;
|
||||
|
||||
/* Check if the node has a "PRT" prefix. */
|
||||
path = strnext(path, "PRT");
|
||||
if (path && isdigit(path[0]) && !path[1]) {
|
||||
acpi_handle_debug(handle, "ignoring data node\n");
|
||||
|
||||
kfree(orig_path);
|
||||
return true;
|
||||
}
|
||||
|
||||
out_free:
|
||||
kfree(orig_path);
|
||||
return false;
|
||||
}
|
||||
|
@ -1737,9 +1737,8 @@ __weak void nfit_intel_shutdown_status(struct nfit_mem *nfit_mem)
|
||||
if ((nfit_mem->dsm_mask & (1 << func)) == 0)
|
||||
return;
|
||||
|
||||
out_obj = acpi_evaluate_dsm(handle, guid, revid, func, &in_obj);
|
||||
if (!out_obj || out_obj->type != ACPI_TYPE_BUFFER
|
||||
|| out_obj->buffer.length < sizeof(smart)) {
|
||||
out_obj = acpi_evaluate_dsm_typed(handle, guid, revid, func, &in_obj, ACPI_TYPE_BUFFER);
|
||||
if (!out_obj || out_obj->buffer.length < sizeof(smart)) {
|
||||
dev_dbg(dev->parent, "%s: failed to retrieve initial health\n",
|
||||
dev_name(dev));
|
||||
ACPI_FREE(out_obj);
|
||||
|
@ -111,7 +111,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
|
||||
snprintf(name, sizeof(name), "%llu", sun);
|
||||
pci_slot = pci_create_slot(pci_bus, device, name, NULL);
|
||||
if (IS_ERR(pci_slot)) {
|
||||
pr_err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
|
||||
pr_err("pci_create_slot returned %pe\n", pci_slot);
|
||||
kfree(slot);
|
||||
return AE_OK;
|
||||
}
|
||||
|
@ -347,13 +347,11 @@ static const struct file_operations acpi_pfrt_log_fops = {
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static int acpi_pfrt_log_remove(struct platform_device *pdev)
|
||||
static void acpi_pfrt_log_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pfrt_log_device *pfrt_log_dev = platform_get_drvdata(pdev);
|
||||
|
||||
misc_deregister(&pfrt_log_dev->miscdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pfrt_log_put_idx(void *data)
|
||||
@ -427,7 +425,7 @@ static struct platform_driver acpi_pfrt_log_driver = {
|
||||
.acpi_match_table = acpi_pfrt_log_ids,
|
||||
},
|
||||
.probe = acpi_pfrt_log_probe,
|
||||
.remove = acpi_pfrt_log_remove,
|
||||
.remove_new = acpi_pfrt_log_remove,
|
||||
};
|
||||
module_platform_driver(acpi_pfrt_log_driver);
|
||||
|
||||
|
@ -489,13 +489,11 @@ static const struct file_operations acpi_pfru_fops = {
|
||||
.llseek = noop_llseek,
|
||||
};
|
||||
|
||||
static int acpi_pfru_remove(struct platform_device *pdev)
|
||||
static void acpi_pfru_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct pfru_device *pfru_dev = platform_get_drvdata(pdev);
|
||||
|
||||
misc_deregister(&pfru_dev->miscdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pfru_put_idx(void *data)
|
||||
@ -567,7 +565,7 @@ static struct platform_driver acpi_pfru_driver = {
|
||||
.acpi_match_table = acpi_pfru_ids,
|
||||
},
|
||||
.probe = acpi_pfru_probe,
|
||||
.remove = acpi_pfru_remove,
|
||||
.remove_new = acpi_pfru_remove,
|
||||
};
|
||||
module_platform_driver(acpi_pfru_driver);
|
||||
|
||||
|
@ -1430,6 +1430,8 @@ int acpi_processor_power_exit(struct acpi_processor *pr)
|
||||
acpi_processor_registered--;
|
||||
if (acpi_processor_registered == 0)
|
||||
cpuidle_unregister_driver(&acpi_idle_driver);
|
||||
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
pr->flags.power_setup_done = 0;
|
||||
|
@ -80,6 +80,9 @@ static bool acpi_nondev_subnode_extract(union acpi_object *desc,
|
||||
struct acpi_data_node *dn;
|
||||
bool result;
|
||||
|
||||
if (acpi_graph_ignore_port(handle))
|
||||
return false;
|
||||
|
||||
dn = kzalloc(sizeof(*dn), GFP_KERNEL);
|
||||
if (!dn)
|
||||
return false;
|
||||
|
@ -468,6 +468,13 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502CGA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B1502CVA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B1502CVA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2402CBA */
|
||||
.matches = {
|
||||
@ -489,6 +496,13 @@ static const struct dmi_system_id irq1_level_low_skip_override[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502CBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus ExpertBook B2502FBA */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "ASUSTeK COMPUTER INC."),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "B2502FBA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Asus Vivobook E1504GA */
|
||||
.matches = {
|
||||
@ -588,6 +602,34 @@ static const struct dmi_system_id irq1_edge_low_force_override[] = {
|
||||
DMI_MATCH(DMI_BOARD_NAME, "GM5RGEE0016COM"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Lunnen Ground 15 / AMD Ryzen 5 5500U */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Lunnen"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "LLL5DAW"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Lunnen Ground 16 / AMD Ryzen 7 5800U */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Lunnen"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "LL6FA"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* MAIBENBEN X577 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MAIBENBEN"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "X577"),
|
||||
},
|
||||
},
|
||||
{
|
||||
/* Maibenben X565 */
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "MAIBENBEN"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "X565"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
|
@ -244,6 +244,53 @@ static int acpi_scan_try_to_offline(struct acpi_device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_scan_check_and_detach(struct acpi_device *adev, void *check)
|
||||
{
|
||||
struct acpi_scan_handler *handler = adev->handler;
|
||||
|
||||
acpi_dev_for_each_child_reverse(adev, acpi_scan_check_and_detach, check);
|
||||
|
||||
if (check) {
|
||||
acpi_bus_get_status(adev);
|
||||
/*
|
||||
* Skip devices that are still there and take the enabled
|
||||
* flag into account.
|
||||
*/
|
||||
if (acpi_device_is_enabled(adev))
|
||||
return 0;
|
||||
|
||||
/* Skip device that have not been enumerated. */
|
||||
if (!acpi_device_enumerated(adev)) {
|
||||
dev_dbg(&adev->dev, "Still not enumerated\n");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
adev->flags.match_driver = false;
|
||||
if (handler) {
|
||||
if (handler->detach)
|
||||
handler->detach(adev);
|
||||
|
||||
adev->handler = NULL;
|
||||
} else {
|
||||
device_release_driver(&adev->dev);
|
||||
}
|
||||
/*
|
||||
* Most likely, the device is going away, so put it into D3cold before
|
||||
* that.
|
||||
*/
|
||||
acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
|
||||
adev->flags.initialized = false;
|
||||
acpi_device_clear_enumerated(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void acpi_scan_check_subtree(struct acpi_device *adev)
|
||||
{
|
||||
acpi_scan_check_and_detach(adev, (void *)true);
|
||||
}
|
||||
|
||||
static int acpi_scan_hot_remove(struct acpi_device *device)
|
||||
{
|
||||
acpi_handle handle = device->handle;
|
||||
@ -289,75 +336,62 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int acpi_scan_device_not_enumerated(struct acpi_device *adev)
|
||||
static int acpi_scan_rescan_bus(struct acpi_device *adev)
|
||||
{
|
||||
if (!acpi_device_enumerated(adev)) {
|
||||
dev_warn(&adev->dev, "Still not enumerated\n");
|
||||
return -EALREADY;
|
||||
}
|
||||
acpi_bus_trim(adev);
|
||||
return 0;
|
||||
struct acpi_scan_handler *handler = adev->handler;
|
||||
int ret;
|
||||
|
||||
if (handler && handler->hotplug.scan_dependent)
|
||||
ret = handler->hotplug.scan_dependent(adev);
|
||||
else
|
||||
ret = acpi_bus_scan(adev->handle);
|
||||
|
||||
if (ret)
|
||||
dev_info(&adev->dev, "Namespace scan failure\n");
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int acpi_scan_device_check(struct acpi_device *adev)
|
||||
{
|
||||
int error;
|
||||
struct acpi_device *parent;
|
||||
|
||||
acpi_bus_get_status(adev);
|
||||
if (acpi_device_is_present(adev)) {
|
||||
/*
|
||||
* This function is only called for device objects for which
|
||||
* matching scan handlers exist. The only situation in which
|
||||
* the scan handler is not attached to this device object yet
|
||||
* is when the device has just appeared (either it wasn't
|
||||
* present at all before or it was removed and then added
|
||||
* again).
|
||||
*/
|
||||
if (adev->handler) {
|
||||
dev_warn(&adev->dev, "Already enumerated\n");
|
||||
return -EALREADY;
|
||||
}
|
||||
error = acpi_bus_scan(adev->handle);
|
||||
if (error) {
|
||||
dev_warn(&adev->dev, "Namespace scan failure\n");
|
||||
return error;
|
||||
}
|
||||
if (!adev->handler) {
|
||||
dev_warn(&adev->dev, "Enumeration failure\n");
|
||||
error = -ENODEV;
|
||||
}
|
||||
} else {
|
||||
error = acpi_scan_device_not_enumerated(adev);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
acpi_scan_check_subtree(adev);
|
||||
|
||||
static int acpi_scan_bus_check(struct acpi_device *adev, void *not_used)
|
||||
{
|
||||
struct acpi_scan_handler *handler = adev->handler;
|
||||
int error;
|
||||
if (!acpi_device_is_present(adev))
|
||||
return 0;
|
||||
|
||||
acpi_bus_get_status(adev);
|
||||
if (!acpi_device_is_present(adev)) {
|
||||
acpi_scan_device_not_enumerated(adev);
|
||||
/*
|
||||
* This function is only called for device objects for which matching
|
||||
* scan handlers exist. The only situation in which the scan handler
|
||||
* is not attached to this device object yet is when the device has
|
||||
* just appeared (either it wasn't present at all before or it was
|
||||
* removed and then added again).
|
||||
*/
|
||||
if (adev->handler) {
|
||||
dev_dbg(&adev->dev, "Already enumerated\n");
|
||||
return 0;
|
||||
}
|
||||
if (handler && handler->hotplug.scan_dependent)
|
||||
return handler->hotplug.scan_dependent(adev);
|
||||
|
||||
error = acpi_bus_scan(adev->handle);
|
||||
if (error) {
|
||||
dev_warn(&adev->dev, "Namespace scan failure\n");
|
||||
return error;
|
||||
}
|
||||
return acpi_dev_for_each_child(adev, acpi_scan_bus_check, NULL);
|
||||
parent = acpi_dev_parent(adev);
|
||||
if (!parent)
|
||||
parent = adev;
|
||||
|
||||
return acpi_scan_rescan_bus(parent);
|
||||
}
|
||||
|
||||
static int acpi_scan_bus_check(struct acpi_device *adev)
|
||||
{
|
||||
acpi_scan_check_subtree(adev);
|
||||
|
||||
return acpi_scan_rescan_bus(adev);
|
||||
}
|
||||
|
||||
static int acpi_generic_hotplug_event(struct acpi_device *adev, u32 type)
|
||||
{
|
||||
switch (type) {
|
||||
case ACPI_NOTIFY_BUS_CHECK:
|
||||
return acpi_scan_bus_check(adev, NULL);
|
||||
return acpi_scan_bus_check(adev);
|
||||
case ACPI_NOTIFY_DEVICE_CHECK:
|
||||
return acpi_scan_device_check(adev);
|
||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||
@ -798,6 +832,7 @@ static const char * const acpi_honor_dep_ids[] = {
|
||||
"INTC1059", /* IVSC (TGL) driver must be loaded to allow i2c access to camera sensors */
|
||||
"INTC1095", /* IVSC (ADL) driver must be loaded to allow i2c access to camera sensors */
|
||||
"INTC100A", /* IVSC (RPL) driver must be loaded to allow i2c access to camera sensors */
|
||||
"INTC10CF", /* IVSC (MTL) driver must be loaded to allow i2c access to camera sensors */
|
||||
NULL
|
||||
};
|
||||
|
||||
@ -1922,6 +1957,11 @@ bool acpi_device_is_present(const struct acpi_device *adev)
|
||||
return adev->status.present || adev->status.functional;
|
||||
}
|
||||
|
||||
bool acpi_device_is_enabled(const struct acpi_device *adev)
|
||||
{
|
||||
return adev->status.present && adev->status.enabled;
|
||||
}
|
||||
|
||||
static bool acpi_scan_handler_matching(struct acpi_scan_handler *handler,
|
||||
const char *idstr,
|
||||
const struct acpi_device_id **matchid)
|
||||
@ -2550,32 +2590,6 @@ int acpi_bus_scan(acpi_handle handle)
|
||||
}
|
||||
EXPORT_SYMBOL(acpi_bus_scan);
|
||||
|
||||
static int acpi_bus_trim_one(struct acpi_device *adev, void *not_used)
|
||||
{
|
||||
struct acpi_scan_handler *handler = adev->handler;
|
||||
|
||||
acpi_dev_for_each_child_reverse(adev, acpi_bus_trim_one, NULL);
|
||||
|
||||
adev->flags.match_driver = false;
|
||||
if (handler) {
|
||||
if (handler->detach)
|
||||
handler->detach(adev);
|
||||
|
||||
adev->handler = NULL;
|
||||
} else {
|
||||
device_release_driver(&adev->dev);
|
||||
}
|
||||
/*
|
||||
* Most likely, the device is going away, so put it into D3cold before
|
||||
* that.
|
||||
*/
|
||||
acpi_device_set_power(adev, ACPI_STATE_D3_COLD);
|
||||
adev->flags.initialized = false;
|
||||
acpi_device_clear_enumerated(adev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_bus_trim - Detach scan handlers and drivers from ACPI device objects.
|
||||
* @adev: Root of the ACPI namespace scope to walk.
|
||||
@ -2584,7 +2598,7 @@ static int acpi_bus_trim_one(struct acpi_device *adev, void *not_used)
|
||||
*/
|
||||
void acpi_bus_trim(struct acpi_device *adev)
|
||||
{
|
||||
acpi_bus_trim_one(adev, NULL);
|
||||
acpi_scan_check_and_detach(adev, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_bus_trim);
|
||||
|
||||
|
@ -100,7 +100,7 @@ static int thermal_temp(int error, int temp_decik, int *ret_temp)
|
||||
*/
|
||||
int thermal_acpi_active_trip_temp(struct acpi_device *adev, int id, int *ret_temp)
|
||||
{
|
||||
int temp_decik;
|
||||
int temp_decik = 0;
|
||||
int ret = acpi_active_trip_temp(adev, id, &temp_decik);
|
||||
|
||||
return thermal_temp(ret, temp_decik, ret_temp);
|
||||
@ -119,7 +119,7 @@ EXPORT_SYMBOL_GPL(thermal_acpi_active_trip_temp);
|
||||
*/
|
||||
int thermal_acpi_passive_trip_temp(struct acpi_device *adev, int *ret_temp)
|
||||
{
|
||||
int temp_decik;
|
||||
int temp_decik = 0;
|
||||
int ret = acpi_passive_trip_temp(adev, &temp_decik);
|
||||
|
||||
return thermal_temp(ret, temp_decik, ret_temp);
|
||||
@ -139,7 +139,7 @@ EXPORT_SYMBOL_GPL(thermal_acpi_passive_trip_temp);
|
||||
*/
|
||||
int thermal_acpi_hot_trip_temp(struct acpi_device *adev, int *ret_temp)
|
||||
{
|
||||
int temp_decik;
|
||||
int temp_decik = 0;
|
||||
int ret = acpi_hot_trip_temp(adev, &temp_decik);
|
||||
|
||||
return thermal_temp(ret, temp_decik, ret_temp);
|
||||
@ -158,7 +158,7 @@ EXPORT_SYMBOL_GPL(thermal_acpi_hot_trip_temp);
|
||||
*/
|
||||
int thermal_acpi_critical_trip_temp(struct acpi_device *adev, int *ret_temp)
|
||||
{
|
||||
int temp_decik;
|
||||
int temp_decik = 0;
|
||||
int ret = acpi_critical_trip_temp(adev, &temp_decik);
|
||||
|
||||
return thermal_temp(ret, temp_decik, ret_temp);
|
||||
|
@ -559,7 +559,7 @@ EXPORT_SYMBOL(acpi_evaluate_ost);
|
||||
*
|
||||
* Caller must free the returned buffer
|
||||
*/
|
||||
static char *acpi_handle_path(acpi_handle handle)
|
||||
char *acpi_handle_path(acpi_handle handle)
|
||||
{
|
||||
struct acpi_buffer buffer = {
|
||||
.length = ACPI_ALLOCATE_BUFFER,
|
||||
|
@ -488,7 +488,21 @@ static int lps0_device_attach(struct acpi_device *adev,
|
||||
rev_id = 1;
|
||||
lps0_dsm_func_mask = validate_dsm(adev->handle,
|
||||
ACPI_LPS0_DSM_UUID, rev_id, &lps0_dsm_guid);
|
||||
lps0_dsm_func_mask_microsoft = -EINVAL;
|
||||
if (lps0_dsm_func_mask > 0 && lps0_dsm_func_mask_microsoft > 0) {
|
||||
unsigned int func_mask;
|
||||
|
||||
/*
|
||||
* Avoid evaluating the same _DSM function for two
|
||||
* different UUIDs and prioritize the MSFT one.
|
||||
*/
|
||||
func_mask = lps0_dsm_func_mask & lps0_dsm_func_mask_microsoft;
|
||||
if (func_mask) {
|
||||
acpi_handle_info(adev->handle,
|
||||
"Duplicate LPS0 _DSM functions (mask: 0x%x)\n",
|
||||
func_mask);
|
||||
lps0_dsm_func_mask &= ~func_mask;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (lps0_dsm_func_mask < 0 && lps0_dsm_func_mask_microsoft < 0)
|
||||
@ -549,19 +563,22 @@ int acpi_s2idle_prepare_late(void)
|
||||
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
|
||||
|
||||
/* LPS0 entry */
|
||||
if (lps0_dsm_func_mask > 0)
|
||||
acpi_sleep_run_lps0_dsm(acpi_s2idle_vendor_amd() ?
|
||||
ACPI_LPS0_ENTRY_AMD :
|
||||
ACPI_LPS0_ENTRY,
|
||||
if (lps0_dsm_func_mask > 0 && acpi_s2idle_vendor_amd())
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY_AMD,
|
||||
lps0_dsm_func_mask, lps0_dsm_guid);
|
||||
|
||||
if (lps0_dsm_func_mask_microsoft > 0) {
|
||||
/* modern standby entry */
|
||||
/* Modern Standby entry */
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_ENTRY,
|
||||
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
|
||||
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
|
||||
}
|
||||
|
||||
if (lps0_dsm_func_mask > 0 && !acpi_s2idle_vendor_amd())
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_ENTRY,
|
||||
lps0_dsm_func_mask, lps0_dsm_guid);
|
||||
|
||||
list_for_each_entry(handler, &lps0_s2idle_devops_head, list_node) {
|
||||
if (handler->prepare)
|
||||
handler->prepare();
|
||||
@ -600,14 +617,14 @@ void acpi_s2idle_restore_early(void)
|
||||
ACPI_LPS0_EXIT_AMD :
|
||||
ACPI_LPS0_EXIT,
|
||||
lps0_dsm_func_mask, lps0_dsm_guid);
|
||||
if (lps0_dsm_func_mask_microsoft > 0)
|
||||
|
||||
if (lps0_dsm_func_mask_microsoft > 0) {
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_EXIT,
|
||||
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
|
||||
|
||||
/* Modern standby exit */
|
||||
if (lps0_dsm_func_mask_microsoft > 0)
|
||||
/* Modern Standby exit */
|
||||
acpi_sleep_run_lps0_dsm(ACPI_LPS0_MS_EXIT,
|
||||
lps0_dsm_func_mask_microsoft, lps0_dsm_guid_microsoft);
|
||||
}
|
||||
|
||||
/* Screen on */
|
||||
if (lps0_dsm_func_mask_microsoft > 0)
|
||||
|
@ -428,7 +428,7 @@ bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_quirk_skip_i2c_client_enumeration);
|
||||
|
||||
int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
|
||||
static int acpi_dmi_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(controller_parent);
|
||||
const struct dmi_system_id *dmi_id;
|
||||
@ -436,8 +436,6 @@ int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *s
|
||||
u64 uid;
|
||||
int ret;
|
||||
|
||||
*skip = false;
|
||||
|
||||
ret = acpi_dev_uid_to_integer(adev, &uid);
|
||||
if (ret)
|
||||
return 0;
|
||||
@ -463,7 +461,6 @@ int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *s
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_quirk_skip_serdev_enumeration);
|
||||
|
||||
bool acpi_quirk_skip_gpio_event_handlers(void)
|
||||
{
|
||||
@ -478,8 +475,41 @@ bool acpi_quirk_skip_gpio_event_handlers(void)
|
||||
return (quirks & ACPI_QUIRK_SKIP_GPIO_EVENT_HANDLERS);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_quirk_skip_gpio_event_handlers);
|
||||
#else
|
||||
static int acpi_dmi_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
|
||||
{
|
||||
struct acpi_device *adev = ACPI_COMPANION(controller_parent);
|
||||
|
||||
*skip = false;
|
||||
|
||||
/*
|
||||
* The DELL0501 ACPI HID represents an UART (CID is set to PNP0501) with
|
||||
* a backlight-controller attached. There is no separate ACPI device with
|
||||
* an UartSerialBusV2() resource to model the backlight-controller.
|
||||
* Set skip to true so that the tty core creates a serdev ctrl device.
|
||||
* The backlight driver will manually create the serdev client device.
|
||||
*/
|
||||
if (acpi_dev_hid_match(adev, "DELL0501")) {
|
||||
*skip = true;
|
||||
/*
|
||||
* Create a platform dev for dell-uart-backlight to bind to.
|
||||
* This is a static device, so no need to store the result.
|
||||
*/
|
||||
platform_device_register_simple("dell-uart-backlight", PLATFORM_DEVID_NONE,
|
||||
NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return acpi_dmi_skip_serdev_enumeration(controller_parent, skip);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_quirk_skip_serdev_enumeration);
|
||||
|
||||
/* Lists of PMIC ACPI HIDs with an (often better) native charger driver */
|
||||
static const struct {
|
||||
const char *hid;
|
||||
|
@ -582,7 +582,7 @@ void acpi_initialize_hp_context(struct acpi_device *adev,
|
||||
void (*uevent)(struct acpi_device *, u32));
|
||||
|
||||
/* acpi_device.dev.bus == &acpi_bus_type */
|
||||
extern struct bus_type acpi_bus_type;
|
||||
extern const struct bus_type acpi_bus_type;
|
||||
|
||||
int acpi_bus_for_each_dev(int (*fn)(struct device *, void *), void *data);
|
||||
int acpi_dev_for_each_child(struct acpi_device *adev,
|
||||
@ -749,6 +749,7 @@ bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *s
|
||||
bool acpi_quirk_skip_acpi_ac_and_battery(void);
|
||||
int acpi_install_cmos_rtc_space_handler(acpi_handle handle);
|
||||
void acpi_remove_cmos_rtc_space_handler(acpi_handle handle);
|
||||
int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip);
|
||||
#else
|
||||
static inline bool acpi_device_override_status(struct acpi_device *adev,
|
||||
unsigned long long *status)
|
||||
@ -766,23 +767,22 @@ static inline int acpi_install_cmos_rtc_space_handler(acpi_handle handle)
|
||||
static inline void acpi_remove_cmos_rtc_space_handler(acpi_handle handle)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)
|
||||
bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev);
|
||||
int acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip);
|
||||
bool acpi_quirk_skip_gpio_event_handlers(void);
|
||||
#else
|
||||
static inline bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline int
|
||||
acpi_quirk_skip_serdev_enumeration(struct device *controller_parent, bool *skip)
|
||||
{
|
||||
*skip = false;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if IS_ENABLED(CONFIG_X86_ANDROID_TABLETS)
|
||||
bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev);
|
||||
bool acpi_quirk_skip_gpio_event_handlers(void);
|
||||
#else
|
||||
static inline bool acpi_quirk_skip_i2c_client_enumeration(struct acpi_device *adev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline bool acpi_quirk_skip_gpio_event_handlers(void)
|
||||
{
|
||||
return false;
|
||||
|
@ -1170,6 +1170,7 @@ static inline void acpi_ec_set_gpe_wake_mask(u8 action) {}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
char *acpi_handle_path(acpi_handle handle);
|
||||
__printf(3, 4)
|
||||
void acpi_handle_printk(const char *level, acpi_handle handle,
|
||||
const char *fmt, ...);
|
||||
|
Loading…
Reference in New Issue
Block a user