Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6/libata-dev.git] / Documentation / acpi / initrd_table_override.txt
blob35c3f5415476dcebd3e3397f719dcc8de5cc41a2
1 Overriding ACPI tables via initrd
2 =================================
4 1) Introduction (What is this about)
5 2) What is this for
6 3) How does it work
7 4) References (Where to retrieve userspace tools)
9 1) What is this about
10 ---------------------
12 If the ACPI_INITRD_TABLE_OVERRIDE compile option is true, it is possible to
13 override nearly any ACPI table provided by the BIOS with an instrumented,
14 modified one.
16 For a full list of ACPI tables that can be overridden, take a look at
17 the char *table_sigs[MAX_ACPI_SIGNATURE]; definition in drivers/acpi/osl.c
18 All ACPI tables iasl (Intel's ACPI compiler and disassembler) knows should
19 be overridable, except:
20    - ACPI_SIG_RSDP (has a signature of 6 bytes)
21    - ACPI_SIG_FACS (does not have an ordinary ACPI table header)
22 Both could get implemented as well.
25 2) What is this for
26 -------------------
28 Please keep in mind that this is a debug option.
29 ACPI tables should not get overridden for productive use.
30 If BIOS ACPI tables are overridden the kernel will get tainted with the
31 TAINT_OVERRIDDEN_ACPI_TABLE flag.
32 Complain to your platform/BIOS vendor if you find a bug which is so sever
33 that a workaround is not accepted in the Linux kernel.
35 Still, it can and should be enabled in any kernel, because:
36   - There is no functional change with not instrumented initrds
37   - It provides a powerful feature to easily debug and test ACPI BIOS table
38     compatibility with the Linux kernel.
41 3) How does it work
42 -------------------
44 # Extract the machine's ACPI tables:
45 cd /tmp
46 acpidump >acpidump
47 acpixtract -a acpidump
48 # Disassemble, modify and recompile them:
49 iasl -d *.dat
50 # For example add this statement into a _PRT (PCI Routing Table) function
51 # of the DSDT:
52 Store("HELLO WORLD", debug)
53 iasl -sa dsdt.dsl
54 # Add the raw ACPI tables to an uncompressed cpio archive.
55 # They must be put into a /kernel/firmware/acpi directory inside the
56 # cpio archive.
57 # The uncompressed cpio archive must be the first.
58 # Other, typically compressed cpio archives, must be
59 # concatenated on top of the uncompressed one.
60 mkdir -p kernel/firmware/acpi
61 cp dsdt.aml kernel/firmware/acpi
62 # A maximum of: #define ACPI_OVERRIDE_TABLES 10
63 # tables are  currently allowed (see osl.c):
64 iasl -sa facp.dsl
65 iasl -sa ssdt1.dsl
66 cp facp.aml kernel/firmware/acpi
67 cp ssdt1.aml kernel/firmware/acpi
68 # Create the uncompressed cpio archive and concatenate the original initrd
69 # on top:
70 find kernel | cpio -H newc --create > /boot/instrumented_initrd
71 cat /boot/initrd >>/boot/instrumented_initrd
72 # reboot with increased acpi debug level, e.g. boot params:
73 acpi.debug_level=0x2 acpi.debug_layer=0xFFFFFFFF
74 # and check your syslog:
75 [    1.268089] ACPI: PCI Interrupt Routing Table [\_SB_.PCI0._PRT]
76 [    1.272091] [ACPI Debug]  String [0x0B] "HELLO WORLD"
78 iasl is able to disassemble and recompile quite a lot different,
79 also static ACPI tables.
82 4) Where to retrieve userspace tools
83 ------------------------------------
85 iasl and acpixtract are part of Intel's ACPICA project:
86 http://acpica.org/
87 and should be packaged by distributions (for example in the acpica package
88 on SUSE).
90 acpidump can be found in Len Browns pmtools:
91 ftp://kernel.org/pub/linux/kernel/people/lenb/acpi/utils/pmtools/acpidump
92 This tool is also part of the acpica package on SUSE.
93 Alternatively, used ACPI tables can be retrieved via sysfs in latest kernels:
94 /sys/firmware/acpi/tables