Включаем ASPM в openSUSE. Часть 2
ВНИМАНИЕ!!! Следуйте советам, приведенным ниже, только в том случае, если вы четко понимаете, что вы делаете. Автор не несет ответственности за любые последствия, вызванные манипуляциями, о которых пойдет речь далее.
Теперь самое время, посмотреть чего же мы все-таки добились нашими действиями. А поскольку наши с вами манипуляции, в корне отличаются от того, что нам дает создание сайтов Киев, позвольте ознакомить вас кратким содержанием первой серии – Начало тут.
Итак, первоначальная задача стояла во включении ASPM для PCI Express. Кстати, предварительно не мешает указать в параметрах ядра pcie_aspm=force и перегрузиться. # dmesg | grep ASPM
[ 0.000000] PCIe ASPM is forcibly enabled
[ 1.783332] ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it
[ 1.931463] ACPI _OSC control for PCIe not granted, disabling ASPM
Как видим, ядро выругалось на метод _OSC и не захотело включать ASPM. Собственно, метод _OSC определяет возможности и детали некоторого устройства и является дочерним для этого устройства.
Теперь смотрим, что же с ним не так.
# dmesg | grep _OSC
[ 1.921997] \_SB_.PCI0:_OSC invalid UUID
[ 1.921999] _OSC request data:1 8 1f
[ 1.931408] \_SB_.PCI0:_OSC invalid UUID
[ 1.931409] _OSC request data:1 1f 1f
[ 1.931413] pci0000:00: Requesting ACPI _OSC control (0x1d)
[ 1.931457] \_SB_.PCI0:_OSC invalid UUID
[ 1.931459] _OSC request data:1 0 1d
[ 1.931462] pci0000:00: ACPI _OSC request failed (AE_ERROR), returned control mask: 0x1d
[ 1.931463] ACPI _OSC control for PCIe not granted, disabling ASPM
То есть можно сделать вывод о том, что методу _OSC не понравился идентификатор нашей шины PCI. Лезем в спецификацию ACPI и смотрим пример реализации этого метода для шины PCI Express. После чего ищем этот метод в нашем исходнике DSDT. У меня например до правки он был таким:
Device (PCI0) // Это начало секции PCI
{
…
//буфер, который теоретически содержит правильный идентификатор и с которым производится сравнение
Name (GUID, Buffer (0×10)
{
/* 0000 */ 0x5B, 0x4D, 0xDB, 0×33, 0xF7, 0x1F, 0x1C, 0×40,
/* 0008 */ 0×96, 0×57, 0×74, 0×41, 0xC0, 0x3D, 0xD7, 0×66
})
Name (SUPP, Zero)
Name (CTRL, Zero)
//Собственно сам метод
Method (_OSC, 4, Serialized)
{
Store (Arg3, Local0)
CreateDWordField (Local0, Zero, CDW1)
CreateDWordField (Local0, 0×04, CDW2)
CreateDWordField (Local0, 0×08, CDW3)
If (LAnd (LEqual (Arg0, GUID), NEXP))
{
Store (CDW2, SUPP)
Store (CDW3, CTRL)
If (Not (And (CDW1, One)))
{
If (And (CTRL, One))
{
NHPG ()
}
If (And (CTRL, 0×04))
{
NPME ()
}
}
If (LNotEqual (Arg1, One))
{
Or (CDW1, 0×08, CDW1)
}
If (LNotEqual (CDW3, CTRL))
{
Or (CDW1, 0×10, CDW1)
}
Store (CTRL, CDW3)
Store (CTRL, OSCC)
Return (Local0)
}
Else
{
Or (CDW1, 0×04, CDW1)
Return (Local0)
}
}
После правки метод _OSC (привожу только его):
Method (_OSC, 4, Serialized)
{
Store (Arg3, Local0)
CreateDWordField (Local0, Zero, CDW1)
CreateDWordField (Local0, 0×04, CDW2)
CreateDWordField (Local0, 0×08, CDW3)
// Check for proper UUID
If(LEqual(Arg0,ToUUID(“33DB4D5B-1FF7-401C-9657-7441C03DD766″)))
{
Store (CDW2, SUPP)
Store (CDW3, CTRL)
If(LNotEqual(And(SUPP, 0×16), 0×16))
{
And(CTRL,0x1E,CTRL)
}
And(CTRL,0x1D,CTRL)
If (Not (And (CDW1, One)))
{
If (And (CTRL, One))
{
NHPG ()
}
If (And (CTRL, 0×04))
{
NPME ()
}
}
If (LNotEqual (Arg1, One))
{
Or (CDW1, 0×08, CDW1)
}
If (LNotEqual (CDW3, CTRL))
{
Or (CDW1, 0×10, CDW1)
}
Store (CTRL, CDW3)
Store (CTRL, OSCC)
Return (Local0)
}
Else
{
Or (CDW1, 0×04, CDW1)
Return (Local0)
}
}
После этого нужно опять скомпилировать нашу таблицу DSDT и снова проделать манипуляции по включению ее в initrd, описанные выше.
После этого вот что мне сказал dmesg:
~> dmesg | grep _OSC
[ 1.941655] pci0000:00: Requesting ACPI _OSC control (0x1d)
[ 1.942228] pci0000:00: ACPI _OSC control (0x1d) granted
~> dmesg | grep ASPM
[ 0.000000] PCIe ASPM is forcibly enabled
[ 1.785347] ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it
Последняя строка должна нас смутить. Лезем в исходники ядра:
static int __init acpi_pci_init(void)
{
int ret;
if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_MSI) {
printk(KERN_INFO”ACPI FADT declares the system doesn’t support MSI, so disable it\n”);
pci_no_msi();
}
if (acpi_gbl_FADT.boot_flags & ACPI_FADT_NO_ASPM) {
printk(KERN_INFO”ACPI FADT declares the system doesn’t support PCIe ASPM, so disable it\n”);
pcie_no_aspm();
}
ret = register_acpi_bus_type(&acpi_pci_bus);
if (ret)
return 0;
pci_set_platform_pm(&acpi_pci_platform_pm);
return 0;
}
и видим, что эта запись выводится в том случае, если ACPI сообщает о том, что ASPM не поддерживается. Но как мы помним, благодаря патчу от Мэтью Гаррета ASPM будет все-равно включен.
И напоследок хочу напомнить вам, что если у вас процессор core iX, то результата эти действия не принесут. Думаю, это из-за того, что контроллер PCI Express встроен в процессоры Intel Core iX. В этом случае лучше уж приобрести рулонный газон и украсить свой сад. Пользы будет больше и отличный фон для кустарников и деревьев будет радовать не только ваш глаз, но и ваших близких и друзей.
При выполнении всех вышеописанных манипуляций ни один ноутбук не пострадал, чего и вам желаю. Но все же считаю необходимым предупредить вас о том, что вы действуете на свой страх и риск.
До новых встреч.
Иногда нужно не только включить ASPM в openSUSE, а еще и расторгнуть договор аренды. И тут конечно нужна помощь квалифицированных юристов. Если у вас возник вопрос, как расторгнуть договор аренды – обязательно обращайтесь в хорошую юридическую фирму и весь процесс пройдет легко и безболезненно для вас и для вашего бизнеса.
Чтоб не ставить SuSE криво, подпишись скорей на мыло:
Читайте также:

Последний год в openSUSE творится что-то ужасное с энергопотреблением.Мой ноутбук Lenovo G550 в режиме серфинга интернета держится от полной зарядки всего 1 час!