Hatred's Log Place

DON'T PANIC!

Jul 12, 2009 - 4 minute read - linux

Asus EeePC 1000HA и AHCI

С чего началось. Ну во первых, с тормозов дисковой подистемы, знаю, что доброго лекарства до сих пор нет, поэтому решил оптимизировать на том, что есть.

Для начала выяснилось, что жесткий диск у меня SATA, а не IDE и поддерживает NCQ. Вот его включить и захотелось.

Вывод dmesg мне дал такое:

libata version 3.00 loaded.
pata_acpi 0000:00:1f.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
pata_acpi 0000:00:1f.2: setting latency timer to 64
pata_acpi 0000:00:1f.2: PCI INT B disabled
ata_piix 0000:00:1f.2: version 2.13
ata_piix 0000:00:1f.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
ata_piix 0000:00:1f.2: MAP [ P0 P2 IDE IDE ]
ata_piix 0000:00:1f.2: setting latency timer to 64
scsi0 : ata_piix
scsi1 : ata_piix
ata1: SATA max UDMA/133 cmd 0x1f0 ctl 0x3f6 bmdma 0xffa0 irq 14
ata2: PATA max UDMA/100 cmd 0x170 ctl 0x376 bmdma 0xffa8 irq 15
ata1.00: ATA-8: ST9160827AS, 3.AAA, max UDMA/133
ata1.00: 312581808 sectors, multi 16: LBA48 NCQ (depth 0/32)
ata1.00: configured for UDMA/133
scsi 0:0:0:0: Direct-Access     ATA      ST9160827AS      3.AA PQ: 0 ANSI: 5

Т.е. модуль ядра для чипсета ata_piix. Попробывал сделать:

echo 31 > /sys/block/sda/device/queue_depth

в результате чего был послан далеко. Начал думать.

Первое, на сайте libata наткнулся, что данный драйвер не поддерживает NCQ и является, по сути драйвером предоставляющим интерфейс Legacy IDE. Там же есть про драйвер AHCI, который для новых чипсетов ICH7 и умеет NCQ и прочие вкусности SATA.

А какой у меня?

Делаю lspci -nn (лишнее убрано):

00:1f.2 IDE interface [0101]: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA IDE Controller [8086:27c4] (rev 02)

понятно, так ICH7, конкретно 82801GBM/GHM.

По этой ссылке смотрю что данный чип умеет… А умеет он оказывается AHCI! Ещё поиск мне сказал, что достаточно в BIOS переключить режим в AHCI… И вот тут начинается оппппа. Да в BIOS EeePC 1000HA просто такого параметра не включили, идите, значится, лесом, пьяные обезьяны…

Ну не может быть всё так безнадежно, в результате нахожу патч для ядра, который написал Matthew Garret (разработчик ядра из RedHat), который принудительно включает AHCI для чипа.

Сам патч: http://www.codon.org.uk/~mjg59/tmp/ahci_quirk_cleanup.diff

Запись в жж, которая ему посвящена: http://mjg59.livejournal.com/85504.html

Теперь как отстроить ядро. Я просто взял, обновил abs, поместил патч рядом с PKGBUILD’ом, а в самом PKGBUILD’е, после строчки накладывающий Арчевский патч, добавил следующее:

patch -Np1 -i ${startdir}/ahci_quirk_cleanup.diff || return 1

На данный момент патч без проблем наложился на ядро 2.6.31.1 и патчи, что накладываются, при сборке бинарного ядра Arch Linux.

Далее, отредактировать /etc/mkinitcpio.conf: в MODULES перед ata_piix добавить ahci (или заменить, но я живу надежной, что установку этой опции сделают в одной из прошивок BIOS).

Теперь дело за малым: собрать и установить ядро. Тут никаких подводных камней не выявилось ((кроме одного: у меня диск разбит просто: своп и корень, корень - jfs. Grub на jfs не смог загрузить второе ядро, пришлось ставить lilo. Ах да! для эксперимента я делал ядро custom, но ремарка, может, кому пригодиться, в будущем)).

После загрузки dmesg радостно сообщил мне:

libata version 3.00 loaded.
ahci 0000:00:1f.2: version 3.0
ahci 0000:00:1f.2: enabling device (0005 -> 0007)
ahci 0000:00:1f.2: PCI INT B -> GSI 19 (level, low) -> IRQ 19
ahci 0000:00:1f.2: irq 27 for MSI/MSI-X
ahci 0000:00:1f.2: forcing PORTS_IMPL to 0xf
ahci: SSS flag set, parallel bus scan disabled
ahci 0000:00:1f.2: AHCI 0001.0100 32 slots 4 ports 1.5 Gbps 0xf impl SATA mode
ahci 0000:00:1f.2: flags: 64bit ncq ilck stag pm led clo pmp pio slum part 
ahci 0000:00:1f.2: setting latency timer to 64
scsi0 : ahci
scsi1 : ahci
scsi2 : ahci
scsi3 : ahci
ata1: SATA max UDMA/133 abar m1024@0x40000000 port 0x40000100 irq 27
ata2: SATA max UDMA/133 abar m1024@0x40000000 port 0x40000180 irq 27
ata3: SATA max UDMA/133 abar m1024@0x40000000 port 0x40000200 irq 27
ata4: SATA max UDMA/133 abar m1024@0x40000000 port 0x40000280 irq 27
ata1: SATA link up 1.5 Gbps (SStatus 113 SControl 300)
ata1.00: ATA-8: ST9160827AS, 3.AAA, max UDMA/133
ata1.00: 312581808 sectors, multi 16: LBA48 NCQ (depth 31/32)
ata1.00: configured for UDMA/133
scsi 0:0:0:0: Direct-Access     ATA      ST9160827AS      3.AA PQ: 0 ANSI: 5
ata2: SATA link down (SStatus 0 SControl 0)
ata3: SATA link down (SStatus 0 SControl 300)
ata4: SATA link down (SStatus 0 SControl 0)

А в выводе lspci -nn стало выглядеть вот так:

00:1f.2 SATA controller [0106]: Intel Corporation 82801GBM/GHM (ICH7 Family) SATA AHCI Controller [8086:27c5] (rev 02)

Теперь буду наблюдать за стабильностью и скоростью.

прошло некоторое время

Да, с базовым патчем система теперь не просыпается после suspend to ram. Лечится путем добавления строчки:

DECLARE_PCI_FIXUP_RESUME_EARLY(PCI_VENDOR_ID_INTEL, 0x27c5, quirk_ahci_sata);

после

DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, 0x27c4, quirk_ahci_sata);

Заметьте, идентификатор 0x27c5, это тот идентификатор, который стал после применения патча. Автор про это знает, собственно в ссылке на ЖЖ этот ответ и есть, правда незнаю, есть ли более свежий патч. Но, думаю, заметка заточена на EeePC 1000HA, а там это железо не слишком отличается, остальные же пусть поэксперементируют, пришлют свои значения ID :simple_smile:

прошло некоторое время

При выключении, перезагрузке система намертво вешается, видать связано с ругательством в dmesg:

pci 0000:00:1f.2: BAR 5: can't allocate resource (bogus alignment) [0x0-0x0] flags 0x0

Написал Метью, может что ответит. Ждем результатов. Если кто поборет - отпишите коммент.

odnaknopka

Tags: archlinux bios eeepc linux

Обновление Пишите код так...

comments powered by Disqus