Поиск
Ожидается релиз
openSUSE 12.1
Другие блоги

Включаем 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 был прогресс, подпишись на RSS!

Чтоб не ставить SuSE криво, подпишись скорей на мыло:

Читайте также:

  1. Включаем ASPM в openSUSE. Часть 1
  2. Боремся с энергопрожорливостью ноутбука
  3. Трехмерный взгляд на Linux или драйвер NVIDIA в openSUSE
  4. Обновление openSUSE: назад в будущее?
  5. Как хамелеон с лэптопом дружбу водили

Один комментарий на “Включаем ASPM в openSUSE. Часть 2”

  • Игорь:

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

Оставить комментарий

Получать новые комментарии по электронной почте. Вы можете подписатьсяi без комментирования.

Счетчики и кнопки

Rambler's Top100 Dobrobot Top Каталог блогов В каталоге DMOZ