| xj | b04a402 | 2021-11-25 15:01:52 +0800 | [diff] [blame] | 1 | Linux ACPI Custom Control Method How To | 
|  | 2 | ======================================= | 
|  | 3 |  | 
|  | 4 | Written by Zhang Rui <rui.zhang@intel.com> | 
|  | 5 |  | 
|  | 6 |  | 
|  | 7 | Linux supports customizing ACPI control methods at runtime. | 
|  | 8 |  | 
|  | 9 | Users can use this to | 
|  | 10 | 1. override an existing method which may not work correctly, | 
|  | 11 | or just for debugging purposes. | 
|  | 12 | 2. insert a completely new method in order to create a missing | 
|  | 13 | method such as _OFF, _ON, _STA, _INI, etc. | 
|  | 14 | For these cases, it is far simpler to dynamically install a single | 
|  | 15 | control method rather than override the entire DSDT, because kernel | 
|  | 16 | rebuild/reboot is not needed and test result can be got in minutes. | 
|  | 17 |  | 
|  | 18 | Note: Only ACPI METHOD can be overridden, any other object types like | 
|  | 19 | "Device", "OperationRegion", are not recognized. Methods | 
|  | 20 | declared inside scope operators are also not supported. | 
|  | 21 | Note: The same ACPI control method can be overridden for many times, | 
|  | 22 | and it's always the latest one that used by Linux/kernel. | 
|  | 23 | Note: To get the ACPI debug object output (Store (AAAA, Debug)), | 
|  | 24 | please run "echo 1 > /sys/module/acpi/parameters/aml_debug_output". | 
|  | 25 |  | 
|  | 26 | 1. override an existing method | 
|  | 27 | a) get the ACPI table via ACPI sysfs I/F. e.g. to get the DSDT, | 
|  | 28 | just run "cat /sys/firmware/acpi/tables/DSDT > /tmp/dsdt.dat" | 
|  | 29 | b) disassemble the table by running "iasl -d dsdt.dat". | 
|  | 30 | c) rewrite the ASL code of the method and save it in a new file, | 
|  | 31 | d) package the new file (psr.asl) to an ACPI table format. | 
|  | 32 | Here is an example of a customized \_SB._AC._PSR method, | 
|  | 33 |  | 
|  | 34 | DefinitionBlock ("", "SSDT", 1, "", "", 0x20080715) | 
|  | 35 | { | 
|  | 36 | Method (\_SB_.AC._PSR, 0, NotSerialized) | 
|  | 37 | { | 
|  | 38 | Store ("In AC _PSR", Debug) | 
|  | 39 | Return (ACON) | 
|  | 40 | } | 
|  | 41 | } | 
|  | 42 | Note that the full pathname of the method in ACPI namespace | 
|  | 43 | should be used. | 
|  | 44 | e) assemble the file to generate the AML code of the method. | 
|  | 45 | e.g. "iasl -vw 6084 psr.asl" (psr.aml is generated as a result) | 
|  | 46 | If parameter "-vw 6084" is not supported by your iASL compiler, | 
|  | 47 | please try a newer version. | 
|  | 48 | f) mount debugfs by "mount -t debugfs none /sys/kernel/debug" | 
|  | 49 | g) override the old method via the debugfs by running | 
|  | 50 | "cat /tmp/psr.aml > /sys/kernel/debug/acpi/custom_method" | 
|  | 51 |  | 
|  | 52 | 2. insert a new method | 
|  | 53 | This is easier than overriding an existing method. | 
|  | 54 | We just need to create the ASL code of the method we want to | 
|  | 55 | insert and then follow the step c) ~ g) in section 1. | 
|  | 56 |  | 
|  | 57 | 3. undo your changes | 
|  | 58 | The "undo" operation is not supported for a new inserted method | 
|  | 59 | right now, i.e. we can not remove a method currently. | 
|  | 60 | For an overridden method, in order to undo your changes, please | 
|  | 61 | save a copy of the method original ASL code in step c) section 1, | 
|  | 62 | and redo step c) ~ g) to override the method with the original one. | 
|  | 63 |  | 
|  | 64 |  | 
|  | 65 | Note: We can use a kernel with multiple custom ACPI method running, | 
|  | 66 | But each individual write to debugfs can implement a SINGLE | 
|  | 67 | method override. i.e. if we want to insert/override multiple | 
|  | 68 | ACPI methods, we need to redo step c) ~ g) for multiple times. | 
|  | 69 |  | 
|  | 70 | Note: Be aware that root can mis-use this driver to modify arbitrary | 
|  | 71 | memory and gain additional rights, if root's privileges got | 
|  | 72 | restricted (for example if root is not allowed to load additional | 
|  | 73 | modules after boot). |