ASPM в linux

О том что это вообще такое Rework ASPM disable code A Proper Solution To The Linux ASPM Problem

А тем кто уже в курсе… стоит все же напомнить о том, что все эти треды Gigabyte советует пользователям Linux не покупать их продукцию или переходить на Windows
ноутбук с нормальной реализацией acpi
Этот ваш 3.2.5
[linux 3.2] доколе?
[ASPM][powersaving]Опубликован патч решающий проблему энергопотребления в linux появились именно из-за этого самого ASPM.
Как я понял суть проблемы и даже решил её у себя.

Суть проблемы: обновились, и даже добавили в grub параметр

pcie_aspm=force

и увидели

dmesg | grep ASPM
[ 0.000000] PCIe ASPM is forcibly enabled
[ 0.232671] ACPI _OSC control for PCIe not granted, disabling ASPM

“Шеф все пропало.” И пора бежать создавать нытик-треды на любимый ЛОР

Но “Это не наш метод” ©

Итак есть такая технология ASPM.
Чтобы все было в шоколаде необходимо чтобы её поддерживало железо и ось.
Ага патчи в наш linux таки добавили.
Т.е. поддержка со стороны ОСи в наличии. Посмотрим на нее подробнее.

Еще раз вспомнили что же там было в ошибке?

[ 0.232671] ACPI _OSC control for PCIe not granted, disabling ASPM

Ага а теперь где же искать

# grep 'ASPM' -r -n /usr/src/linux/drivers/acpi
/usr/src/linux/drivers/acpi/pci_root.c:599: if
(acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) {
/usr/src/linux/drivers/acpi/pci_root.c:601: \* We have ASPM control,
but the FADT indicates
/usr/src/linux/drivers/acpi/pci_root.c:612: "disabling ASPM\\n");

Угу вот и оно! А конкретно

/\*\*
\* acpi_pci_osc_control_set - Request control of PCI root _OSC
features.
\* @handle: ACPI handle of a PCI root bridge (or PCIe Root Complex).
\* @mask: Mask of _OSC bits to request control of, place to store
control mask.
\* @req: Mask of _OSC bits the control of is essential to the caller.
\*
\* Run _OSC query for @mask and if that is successful, compare the
returned
\* mask of control bits with @req. If all of the @req bits are set in
the
\* returned mask, run _OSC request for it.
\*
\* The variable at the @mask address may be modified regardless of
whether or
\* not the function returns success. On success it will contain the
mask of
\* _OSC bits the BIOS has granted control of, but its contents are
meaningless
\* on failure.
\*\*/

И тут даже без перевода становится ясно что корни “бага” зарыты в BIOS.
Итак чего там я имею в моем dsdt?

grep OSC acer-aspire-5730zg-bios.v-1.22-org.dsl

Молчит. Внимание вопрос с какого перепугу ОСь будет включать поддержку того чего как ей сказал BIOS посредством DSDT железо не поддерживает?
Однако стойте. Мы же не в каменном веке живем! Ну ладно да есть и среди нас слоупоки с арифмометрами… Но все более менее вменяемое компьютерное оборудование выпущенное не в каменном веке просто обязано поддерживать ASPM!

Значит после того как я все это осмыслил то немного погуглил… а потом еще немного погуглил… и нашел то, что было нужно.

Суть эксперимента в DSDT было добавлено :

Scope (\\_SB.PCI0)
{
Name (SUPP, 0x00)
Name (CTRL, 0x00)
Method (_OSC, 4, NotSerialized)
{
If (LEqual (Arg0, Buffer (0x10)
{
/\* 0000 \*/ 0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40,
/\* 0008 \*/ 0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66
}))
{
CreateDWordField (Arg3, 0x00, CDW1)
CreateDWordField (Arg3, 0x04, CDW2)
CreateDWordField (Arg3, 0x08, CDW3)
Store (CDW2, SUPP)
Store (CDW3, CTRL)
If (LNotEqual (And (SUPP, 0x16), 0x16))
{
And (CTRL, 0x1E, CTRL)
}
And (CTRL, 0x1D, CTRL)
If (Not (And (CDW1, 0x01)))
{
If (And (CTRL, 0x01)) {}
If (And (CTRL, 0x04)) {}
If (And (CTRL, 0x10)) {}
}
If (LNotEqual (Arg1, One))
{
Or (CDW1, 0x08, CDW1)
}
If (LNotEqual (CDW3, CTRL))
{
Or (CDW1, 0x10, CDW1)
}
Store (CTRL, CDW3)
Return (Arg3)
}
Else
{
Or (CDW1, 0x04, CDW1)
Return (Arg3)
}
}

И чтобы ради такого пустяка попросту не терять шанс я еще и добавил пофикшенное SSDT в DSDT. О том как это проделать вы прочитаете тут Custom SSDT Table for EIST on my Laptop

Вот окончательный патчь на мою уже основательно переделанную DSDT добавляющий исправленное SSDT и метод _OSC

# diff -u acer-aspire-5730zg-bios.v-1.24_dsdt.dsl dsdt.dsl
--- acer-aspire-5730zg-bios.v-1.24_dsdt.dsl 2012-02-17
21:55:01.000000000 +0200
+++ dsdt.dsl 2012-02-19 13:54:39.000000000 +0200
@@ -6020,4 +6042,297 @@
Zero,
Zero
})
+
+ Scope (_PR_.CPU0)
+ {
+ Name (HI0, Zero)
+ Name (HC0, Zero)
+ Method (_PDC, 1, NotSerialized)
+ {
+ Store (CPDC (Arg0), Local0)
+ GCAP (Local0)
+ }
+
+ Method (_OSC, 4, NotSerialized)
+ {
+ Store (COSC (Arg0, Arg1, Arg2, Arg3), Local0)
+ GCAP (Local0)
+ Return (Local0)
+ }
+
+ Method (CPDC, 1, NotSerialized)
+ {
+ CreateDWordField (Arg0, Zero, REVS)
+ CreateDWordField (Arg0, 0x04, SIZE)
+ Store (SizeOf (Arg0), Local0)
+ Store (Subtract (Local0, 0x08), Local1)
+ CreateField (Arg0, 0x40, Multiply (Local1, 0x08), TEMP)
+ Name (STS0, Buffer (0x04)
+ {
+ 0x00, 0x00, 0x00, 0x00
+ })
+ Concatenate (STS0, TEMP, Local2)
+ Return (COSC (Buffer (0x10)
+ {
+ /\* 0000 \*/ 0x16, 0xA6, 0x77, 0x40, 0x0C, 0x29, 0xBE, 0x47,
+ /\* 0008 \*/ 0x9E, 0xBD, 0xD8, 0x70, 0x58, 0x71, 0x39, 0x53
+ }, REVS, SIZE, Local2))
+ }
+
+ Method (COSC, 4, NotSerialized)
+ {
+ CreateDWordField (Arg3, Zero, STS0)
+ CreateDWordField (Arg3, 0x04, CAP0)
+ CreateDWordField (Arg0, Zero, IID0)
+ CreateDWordField (Arg0, 0x04, IID1)
+ CreateDWordField (Arg0, 0x08, IID2)
+ CreateDWordField (Arg0, 0x0C, IID3)
+ Name (UID0, Buffer (0x10)
+ {
+ /\* 0000 \*/ 0x16, 0xA6, 0x77, 0x40, 0x0C, 0x29, 0xBE, 0x47,
+ /\* 0008 \*/ 0x9E, 0xBD, 0xD8, 0x70, 0x58, 0x71, 0x39, 0x53
+ })
+ CreateDWordField (UID0, Zero, EID0)
+ CreateDWordField (UID0, 0x04, EID1)
+ CreateDWordField (UID0, 0x08, EID2)
+ CreateDWordField (UID0, 0x0C, EID3)
+ If (LNot (LAnd (LAnd (LEqual (IID0, EID0), LEqual (IID1, EID1)),
+ LAnd (LEqual (IID2, EID2), LEqual (IID3, EID3)))))
+ {
+ Store (0x06, STS0)
+ Return (Arg3)
+ }
+
+ If (LNotEqual (Arg1, One)) {
+ Store (0x0A, STS0)
+ Return (Arg3)
+ }
+
+ Return (Arg3)
+ }
+
+ Method (GCAP, 1, NotSerialized)
+ {
+ CreateDWordField (Arg0, Zero, STS0)
+ CreateDWordField (Arg0, 0x04, CAP0)
+ If (LOr (LEqual (STS0, 0x06), LEqual (STS0, 0x0A))) {
+ Return (Zero)
+ }
+
+ If (And (STS0, One)) {
+ And (CAP0, 0x0BFF, CAP0)
+ Return (Zero)
+ }
+
+ Or (And (PDC0, 0x7FFFFFFF), CAP0, PDC0)
+ If (And (CFGD, One)) {
+ If (LAnd (LAnd (And (CFGD, 0x01000000), LEqual (And (PDC0,
+ 0x09), 0x09)), LNot (And (SDTL, One)))) {
+ Or (SDTL, One, SDTL)
+ OperationRegion (IST0, SystemMemory, DerefOf (Index (SSDT, One)),
DerefOf (Index (SSDT, 0x02
+ )))
+ Load (IST0, HI0)
+ }
+ }
+
+ If (And (CFGD, 0xF0)) {
+ If (LAnd (LAnd (And (CFGD, 0x01000000), And (PDC0, 0x18
+ )), LNot (And (SDTL, 0x02)))) {
+ Or (SDTL, 0x02, SDTL)
+ OperationRegion (CST0, SystemMemory, DerefOf (Index (SSDT, 0x07)),
DerefOf (Index (SSDT, 0x08
+ )))
+ Load (CST0, HC0)
+ }
+ }
+
+ Return (Zero)
+ }
+ }
+
+ Scope (_PR_.CPU1)
+ {
+ Name (HI1, Zero)
+ Name (HC1, Zero)
+ Method (_PDC, 1, NotSerialized)
+ {
+ Store (\^\^CPU0.CPDC (Arg0), Local0)
+ GCAP (Local0)
+ }
+
+ Method (_OSC, 4, NotSerialized)
+ {
+ Store (\^\^CPU0.COSC (Arg0, Arg1, Arg2, Arg3), Local0)
+ GCAP (Local0)
+ Return (Local0)
+ }
+
+ Method (GCAP, 1, NotSerialized)
+ {
+ CreateDWordField (Arg0, Zero, STS1)
+ CreateDWordField (Arg0, 0x04, CAP1)
+ If (LOr (LEqual (STS1, 0x06), LEqual (STS1, 0x0A))) {
+ Return (Zero)
+ }
+
+ If (And (STS1, One)) {
+ And (CAP1, 0x0BFF, CAP1)
+ Return (Zero)
+ }
+
+ Or (And (PDC1, 0x7FFFFFFF), CAP1, PDC1)
+ If (LEqual (And (PDC0, 0x09), 0x09)) {
+ APPT ()
+ }
+
+ If (And (PDC0, 0x18)) {
+ APCT ()
+ }
+
+ Return (Zero)
+ }
+
+ Method (APCT, 0, NotSerialized)
+ {
+ If (LAnd (And (CFGD, 0xF0), LNot (And (SDTL, 0x20
+ )))) {
+ Or (SDTL, 0x20, SDTL)
+ OperationRegion (CST1, SystemMemory, DerefOf (Index (SSDT, 0x0A)),
DerefOf (Index (SSDT, 0x0B
+ )))
+ Load (CST1, HC1)
+ }
+ }
+
+ Method (APPT, 0, NotSerialized)
+ {
+ If (LAnd (And (CFGD, One), LNot (And (SDTL, 0x10
+ )))) {
+ Or (SDTL, 0x10, SDTL)
+ OperationRegion (IST1, SystemMemory, DerefOf (Index (SSDT, 0x04)),
DerefOf (Index (SSDT, 0x05
+ )))
+ Load (IST1, HI1)
+ }
+ }
+ }
+
+ Scope (_PR_.CPU2)
+ {
+ Method (_PDC, 1, NotSerialized)
+ {
+ Store (\^\^CPU0.CPDC (Arg0), Local0)
+ GCAP (Local0)
+ }
+
+ Method (_OSC, 4, NotSerialized)
+ {
+ Store (\^\^CPU0.COSC (Arg0, Arg1, Arg2, Arg3), Local0)
+ GCAP (Local0)
+ Return (Local0)
+ }
+
+ Method (GCAP, 1, NotSerialized)
+ {
+ CreateDWordField (Arg0, Zero, STS2)
+ CreateDWordField (Arg0, 0x04, CAP2)
+ If (LOr (LEqual (STS2, 0x06), LEqual (STS2, 0x0A))) {
+ Return (Zero)
+ }
+
+ If (And (STS2, One)) {
+ And (CAP2, 0x0BFF, CAP2)
+ Return (Zero)
+ }
+
+ Or (And (PDC2, 0x7FFFFFFF), CAP2, PDC2)
+ If (LEqual (And (PDC2, 0x09), 0x09)) {
+ \^\^CPU1.APPT ()
+ }
+
+ If (And (PDC2, 0x18)) {
+ \^\^CPU1.APCT ()
+ }
+
+ Return (Zero)
+ }
+ }
+
+ Scope (_PR_.CPU3)
+ {
+ Method (_PDC, 1, NotSerialized)
+ {
+ Store (\^\^CPU0.CPDC (Arg0), Local0)
+ GCAP (Local0)
+ }
+
+ Method (_OSC, 4, NotSerialized)
+ {
+ Store (\^\^CPU0.COSC (Arg0, Arg1, Arg2, Arg3), Local0)
+ GCAP (Local0)
+ Return (Local0)
+ }
+
+ Method (GCAP, 1, NotSerialized)
+ {
+ CreateDWordField (Arg0, Zero, STS3)
+ CreateDWordField (Arg0, 0x04, CAP3)
+ If (LOr (LEqual (STS3, 0x06), LEqual (STS3, 0x0A))) {
+ Return (Zero)
+ }
+
+ If (And (STS3, One)) {
+ And (CAP3, 0x0BFF, CAP3)
+ Return (Zero)
+ }
+
+ Or (And (PDC3, 0x7FFFFFFF), CAP3, PDC3)
+ If (LEqual (And (PDC2, 0x09), 0x09)) {
+ \^\^CPU1.APPT ()
+ }
+
+ If (And (PDC2, 0x18)) {
+ \^\^CPU1.APCT ()
+ }
+
+ Return (Zero)
+ }
+ }
+ Scope (_SB_.PCI0)
+ {
+ Name (SUPP, Zero)
+ Name (CTRL, Zero)
+ Method (_OSC, 4, NotSerialized)
+ {
+ If (LEqual (Arg0, Buffer (0x10) {
+ /\* 0000 \*/ 0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40,
+ /\* 0008 \*/ 0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66
+ }))
+ {
+ CreateDWordField (Arg3, Zero, CDW1)
+ CreateDWordField (Arg3, 0x04, CDW2)
+ CreateDWordField (Arg3, 0x08, CDW3)
+ Store (CDW2, SUPP)
+ Store (CDW3, CTRL)
+ If (LNotEqual (And (SUPP, 0x16), 0x16)) {
+ And (CTRL, 0x1E, CTRL)
+ }
+ And (CTRL, 0x1D, CTRL)
+ If (Not (And (CDW1, One))) {
+ If (And (CTRL, One)) {}
+ If (And (CTRL, 0x04)) {}
+ If (And (CTRL, 0x10)) {}
+ }
+ If (LNotEqual (Arg1, One)) {
+ Or (CDW1, 0x08, CDW1)
+ }
+ If (LNotEqual (CDW3, CTRL)) {
+ Or (CDW1, 0x10, CDW1)
+ }
+ Store (CTRL, CDW3)
+ Return (Arg3)
+ } Else {
+ Or (CDW1, 0x04, CDW1)
+ Return (Arg3)
+ }
+ }
+ }
}
+

Собираю новое ядро, для того чтобы измененная SSDT грузилась из файла добавляю к параметрам загрузки ядра acpi_no_auto_ssdt перезапускаю и вуаля…

Если быть кратким то

# dmesg | egrep -i 'ASPM'
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.2.7-geek-libre-2 pcie_aspm=force acpi_osi=Linux acpi_no_auto_ssdt enable_mtrr_cleanup usbcore.autosuspend=1 ro console=tty1 vga=791 fastboot quiet root=/dev/sda4 rootfstype=ext4
[ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-3.2.7-geek-libre-2 pcie_aspm=force acpi_osi=Linux acpi_no_auto_ssdt enable_mtrr_cleanup usbcore.autosuspend=1 ro console=tty1 vga=791 fastboot quiet root= /dev/sda4 rootfstype=ext4
[ 0.000000] PCIe ASPM is forcibly enabled

Что и требовалось доказать. Ну а если не очень…

# dmesg | egrep -i 'acpi|ASPM'
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-3.2.7-geek-libre-2 pcie_aspm=force acpi_osi=Linux acpi_no_auto_ssdt enable_mtrr_cleanup usbcore.autosuspend=1 ro console=tty1 vga=791 fastboot quiet root=/dev/sda4 rootfstype=ext4
[ 0.000000] BIOS-e820: 00000000bfd64000 - 00000000bfd9f000 (ACPI NVS)
[ 0.000000] BIOS-e820: 00000000bfde2000 - 00000000bfdff000 (ACPI data)
[ 0.000000] ACPI: RSDP 00000000000f7160 00024 (v02 PTLTD )
[ 0.000000] ACPI: XSDT 00000000bfdf447d 0005C (v01 ACRSYS ACRPRDCT
06040000 INNA 00000000)
[ 0.000000] ACPI: FACP 00000000bfde4000 000F4 (v03 INTEL CRESTLNE
06040000 ALAN 00000001)
[ 0.000000] ACPI: Override [DSDT-CANTIGA ], this is unsafe: tainting
kernel
[ 0.000000] ACPI: DSDT @ 0x00000000bfde5000 Table override, replaced
with:
[ 0.000000] ACPI: DSDT ffffffff8183e400 06A1B (v02 Intel CANTIGA
00000001 INTL 20111123)
[ 0.000000] ACPI: FACS 00000000bfd9efc0 00040
[ 0.000000] ACPI: HPET 00000000bfdfed86 00038 (v01 INTEL CRESTLNE
06040000 LOHR 0000005A)
[ 0.000000] ACPI: MCFG 00000000bfdfedbe 0003C (v01 INTEL CRESTLNE
06040000 LOHR 0000005A)
[ 0.000000] ACPI: SLIC 00000000bfdfedfa 00176 (v01 ACRSYS ACRPRDCT
06040000 ANNI 00000001)
[ 0.000000] ACPI: APIC 00000000bfdfef70 00068 (v01 PTLTD ? APIC
06040000 LTP 00000000)
[ 0.000000] ACPI: BOOT 00000000bfdfefd8 00028 (v01 PTLTD \$SBFTBL\$
06040000 LTP 00000001)
[ 0.000000] ACPI: SSDT 00000000bfde3000 00655 (v01 PmRef CpuPm 00003000
INTL 20050624)
[ 0.000000] ACPI: Local APIC address 0xfee00000
[ 0.000000] ACPI: PM-Timer IO Port: 0x408
[ 0.000000] ACPI: Local APIC address 0xfee00000
[ 0.000000] ACPI: LAPIC (acpi_id[0x00] lapic_id[0x00] enabled)
[ 0.000000] ACPI: LAPIC (acpi_id[0x01] lapic_id[0x01] enabled)
[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x00] high edge lint[0x1])
[ 0.000000] ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
[ 0.000000] ACPI: IOAPIC (id[0x02] address[0xfec00000] gsi_base[0])
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 0 global_irq 2 high
edge)
[ 0.000000] ACPI: INT_SRC_OVR (bus 0 bus_irq 9 global_irq 9 high
level)
[ 0.000000] ACPI: IRQ0 used by override.
[ 0.000000] ACPI: IRQ2 used by override.
[ 0.000000] ACPI: IRQ9 used by override.
[ 0.000000] Using ACPI (MADT) for SMP configuration information
[ 0.000000] ACPI: HPET id: 0x8086a201 base: 0xfed00000
[ 0.000000] Kernel command line:
BOOT_IMAGE=/vmlinuz-3.2.7-geek-libre-2 pcie_aspm=force acpi_osi=Linux
acpi_no_auto_ssdt enable_mtrr_cleanup usbcore.autosuspend=1 ro
console=tty1 vga=791 fastboot quiet root=/dev/sda4 rootfstype=ext4
[ 0.000000] PCIe ASPM is forcibly enabled
[ 0.000000] ACPI: SSDT auto-load disabled
[ 0.001390] ACPI: Core revision 20110623
[ 0.004621] ACPI: SSDT ignored due to "acpi_no_auto_ssdt"
[ 0.090273] PM: Registering ACPI NVS region at bfd64000 (241664 bytes)
[ 0.090273] ACPI: bus type pci registered
[ 0.168335] ACPI: Added _OSI(Module Device)
[ 0.168335] ACPI: Added _OSI(Processor Device)
[ 0.168335] ACPI: Added _OSI(3.0 _SCP Extensions)
[ 0.168335] ACPI: Added _OSI(Processor Aggregator Device)
[ 0.168335] ACPI: Added _OSI(Linux)
[ 0.169966] ACPI: EC: Look up EC in DSDT
[ 0.173086] [Firmware Bug]: ACPI: BIOS _OSI(Linux) query honored via
cmdline
[ 0.173493] ACPI: SSDT 00000000bfd1ac20 00265 (v01 PmRef Cpu0Ist
00003000 INTL 20050624)
[ 0.173849] ACPI: Dynamic OEM Table Load:
[ 0.173853] ACPI: SSDT (null) 00265 (v01 PmRef Cpu0Ist 00003000 INTL
20050624)
[ 0.173978] ACPI: SSDT 00000000bfd18620 00549 (v01 PmRef Cpu0Cst
00003001 INTL 20050624)
[ 0.174321] ACPI: Dynamic OEM Table Load:
[ 0.174324] ACPI: SSDT (null) 00549 (v01 PmRef Cpu0Cst 00003001 INTL
20050624)
[ 0.180234] ACPI: SSDT 00000000bfd19ca0 001CF (v01 PmRef ApIst 00003000
INTL 20050624)
[ 0.180604] ACPI: Dynamic OEM Table Load:
[ 0.180607] ACPI: SSDT (null) 001CF (v01 PmRef ApIst 00003000 INTL
20050624)
[ 0.183073] ACPI: SSDT 00000000bfd19f20 0008D (v01 PmRef ApCst 00003000
INTL 20050624)
[ 0.183423] ACPI: Dynamic OEM Table Load:
[ 0.183426] ACPI: SSDT (null) 0008D (v01 PmRef ApCst 00003000 INTL
20050624)
[ 0.203067] ACPI: Interpreter enabled
[ 0.203072] ACPI: (supports S0 S3 S4 S5)
[ 0.203093] ACPI: Using IOAPIC for interrupt routing
[ 0.215408] ACPI: EC: GPE = 0x17, I/O: command/status = 0x66, data =
0x62
[ 0.215454] PCI: Using host bridge windows from ACPI; if necessary, use
"pci=nocrs" and report a bug
[ 0.215778] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-ff])
[ 0.226529] ACPI: PCI Interrupt Routing Table [\\_SB_.PCI0._PRT]
[ 0.226628] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.PEGP._PRT]
[ 0.226681] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.P0P1._PRT]
[ 0.226753] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.RP01._PRT]
[ 0.226788] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.RP02._PRT]
[ 0.226822] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.RP03._PRT]
[ 0.226855] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.RP04._PRT]
[ 0.226902] ACPI: PCI Interrupt Routing Table
[\\_SB_.PCI0.RP05._PRT]
[ 0.227038] pci0000:00: Requesting ACPI _OSC control (0x1d)
[ 0.227190] pci0000:00: ACPI _OSC control (0x1d) granted
[ 0.233327] ACPI: PCI Interrupt Link [LNKA] (IRQs 3 4 5 6 7 10 \*11 12
14 15)
[ 0.233380] ACPI: PCI Interrupt Link [LNKB] (IRQs 3 4 5 6 7 10 \*11 12
14 15)
[ 0.233429] ACPI: PCI Interrupt Link [LNKC] (IRQs 3 4 5 6 7 \*10 11 12
14 15)
[ 0.233477] ACPI: PCI Interrupt Link [LNKD] (IRQs 3 4 5 6 7 \*10 11 12
14 15)
[ 0.233525] ACPI: PCI Interrupt Link [LNKE] (IRQs 3 4 5 6 7 10 \*11 12
14 15)
[ 0.233572] ACPI: PCI Interrupt Link [LNKF] (IRQs 3 4 5 6 7 \*10 11 12
14 15)
[ 0.233620] ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 10 11 12 14
15) \*0, disabled.
[ 0.233669] ACPI: PCI Interrupt Link [LNKH] (IRQs 3 4 5 6 7 \*10 11 12
14 15)
[ 0.234110] PCI: Using ACPI for IRQ routing
[ 0.248808] pnp: PnP ACPI init
[ 0.248830] ACPI: bus type pnp registered
[ 0.249283] pnp 00:00: Plug and Play ACPI device, IDs PNP0a08 PNP0a03
(active)
[ 0.249382] pnp 00:01: Plug and Play ACPI device, IDs APP0001 (active)
[ 0.249471] pnp 00:02: Plug and Play ACPI device, IDs PNP0303 (active)
[ 0.249517] pnp 00:03: Plug and Play ACPI device, IDs SYN0302 SYN0300
SYN0002 PNP0f13 (active)
[ 0.249566] pnp 00:04: Plug and Play ACPI device, IDs PNP0200 (active)
[ 0.249610] pnp 00:05: Plug and Play ACPI device, IDs INT0800 (active)
[ 0.249859] system 00:06: Plug and Play ACPI device, IDs PNP0103
PNP0c01 (active)
[ 0.249917] pnp 00:07: Plug and Play ACPI device, IDs PNP0c04 (active)
[ 0.250068] system 00:08: Plug and Play ACPI device, IDs PNP0c02
(active)
[ 0.250108] pnp 00:09: Plug and Play ACPI device, IDs PNP0b00 (active)
[ 0.250362] system 00:0a: Plug and Play ACPI device, IDs PNP0c02
(active)
[ 0.250495] pnp: PnP ACPI: found 11 devices
[ 0.250497] ACPI: ACPI bus type pnp unregistered
[ 9.094046] ACPI: Lid Switch [LID0]
[ 9.094179] ACPI: Sleep Button [SLPB]
[ 9.094282] ACPI: Power Button [PWRB]
[ 9.094376] ACPI: Power Button [PWRF]
[ 9.190407] ACPI: acpi_idle registered with cpuidle
[ 9.287191] ACPI: Battery Slot [BAT0] (battery present)
[ 9.291185] acpi device:03: registered as cooling_device2
[ 9.293260] ACPI: Video Device [VGA] (multi-head: yes rom: no post:
no)
[ 9.297142] ACPI: AC Adapter [ADP1] (on-line)
[ 9.309098] ACPI: Thermal Zone [TZS0] (58 C)
[ 9.325670] ACPI: Thermal Zone [TZS1] (58 C)
[ 9.347968] snd_hda_intel 0000:00:1b.0: power state changed by ACPI
to D0
[ 9.347976] snd_hda_intel 0000:00:1b.0: power state changed by ACPI
to D0
[ 11.897194] pciehp: Using ACPI for slot detection.

Эксперимент был проведен на мой страх и риск. В результате поставленного эксперимента ноутбук не пострадал. Из положительных моментов - работа ASPM проявилась в снижении температуры корпуса и как следствие уменьшении шума от встроенного вентиллятора. К сожалению провести эксперименты на работе от аккумулятора не представляется возможным в виду предсмертного состояния последнего :Р

Как говорится хотели как лучше а вышло… угу ну или благими намерениями…
Скорее всего метод _OSC на подходящем железе можно эмулировать и из самой ОСи… Ну или патчь как то менять и пользоваться не только информацией из BIOS-а который зачастую врет.

Из неразрешенного на данный момент осталось:

[Firmware Bug]: ACPI: BIOS _OSI(Linux) query honored via cmdline

и

ACPI: PCI Interrupt Link [LNKG] (IRQs 3 4 5 6 7 10 11 12 14 15) \*0, disabled.

Не знаю насколько это страшно… Но где в общем случае корни этой проблемы уже ясно. Спасибо за внимание. :)

PS: Пользуясь случаем передаю свой пламенный привет всем уродам не соблюдающим официальные спецификации.

Comments