ATX napájení a PME

Obsah

Úvodem

Jak je vlastně na motherboardu zařízeno, že po stisknutí slaboproudého tlačítka začne počítač startovat?
Zvenčí je vidět, že "power button" je vstup s pull-upem na +3.3V, který se tlačítkem krátce zkratuje k zemi, a zase pustí (uplave vzhůru).
Motherboard zareaguje tak, že "přitáhne k zemi" PS_ON# vstup napájecího ATX zdroje (zelený drát), a drží ho dole.
Zdroj reaguje tak, že rozjede hlavní měnič, který živí silové napájecí větve.
Tím obživne procesor a začne vcelku známá bootovací sekvence: skok na well-known adresu v ROM (startovní vektor), kterým začíná BIOS POST.
Aby logika kolem tlačítka fungovala, potřebuje motherboard od zdroje trvalé stand-by napájení: +5VSB (fialový drát), původně stačilo cca 0.5A, dle ATX 2.0 už asi 2A, serverové zdroje umí i víc (kolem 4A). Motherboard si z něj sám vyrábí +3.3VSB pro čipy, které tuto hladinu vyžadují.

A to je všechno? No... pokud Vás zajímají detaily, zjistíte, že zdaleka není :-)

ATX napájení mexi south bridgem a SuperIO

Zapnutí/vypnutí napájení v ATX motherboardu dělá z větší části SuperIO šváb. Přinejmenším v tom smyslu, že přijme vstup od tlačítka "power button" a otevřeným kolektorem na svém konkrétním pinu přitáhne k zemi PS_ON vstup zdroje.


Zdroj: datasheet W83627DHG, str. 176 PDF souboru (164 v tisku)

Z obrázku a doprovodného textu plyne, že je to celé trochu složitější: rozhodnutí, zda zapnout, činí nakonec south bridge. Takže se v sekvenci zapnutí počítače "dominově" uplatní postupně všechny čtyři signály:

  1. PSIN = vstup od tlačítka power button
  2. PSOUT = SuperIO south bridgi: budíček!
  3. SLP_S3 / SUSB = south bridge: no tak jó, teda...
  4. PSON = SuperIO zdroji: a jedem :-)

Zkratky signálů se u různých výrobců čipů a motherboardů mohou lišit, jejich význam je ale ustálený.

SuperIO čip tedy spolupracuje se south bridgem, ve kterém je např. RTC a NVRAM.
SuperIO čip taky umí zařídit automatické naběhnutí po přivedení napájení.
Zálohovací baterka CMOS NVRAM (CR2032 apod.) ve skutečnosti nezálohuje jenom konfiguraci v NVRAM, ale taky vybrané další obvody uvnitř south bridge a SuperIO. V datasheetech SuperIO a south bridge bývá přehled, které vnitřní bloky jsou zálohované baterkou.
V datasheetu SuperIO lze dohledat konkrétní konfigurační registr (týká se "ACPI device") a v něm asi dva bity, které říkají, zda má počítač po naběhnutí napájení rovnou startovat, nebo zůstat ležet, nebo "podle předchozího stavu" = SuperIO šváb si díky baterce pamatuje, jestli posledně proběhl košer ATX power-down v jeho režii, nebo jestli napájení padlo samo od sebe. (A někdy ta logika nefunguje správně, nebo je bug v BIOSu který to špatně nakonfiguruje apod.)

PME#, WAKE# a spol

Tyto signály dokážou zařídit, aby se počítač sám probudil.

PME# je vstup south bridge nebo PCI bridge.
V PCI sběrnici je to jediný drát s jednoduchou funkcí: pokud za něj někdo zatahá v některém stand-by stavu (
ACPI S3/S4/S5, tzn. spánek, hibernace nebo power off), motherboard by měl nahodit zdroj a začít startovat - jako při stisku tlačítka "power button".
South bridge čip je BIOSem (nebo OS?) nakonfigurovaný, zda má reagovat na PME# nebo ho ignorovat - toto nastavení je zálohováno napájecí větví +5VSB. (Přesněji řečeno: dle dokumentace Intel ICH4 je dotyčný konfigurační bit PME_EN podepřený dokonce baterkou, protože sdílí napájení s RTC obvodem - ale výpadkem stand-by napájení je bit PME_EN resetován, přinejmenším v tomto čipsetu. Takže po výpadku napájecí sítě přestane probouzení fungovat.) V některých BIOSech v SETUPu existovala volba "PME# enable", v jiných BIOSech bývaly "lidsky" pojmenované volby "povolit probuzení zařízením A/B/C/D/E". Mohlo to být pohromadě v menu zvaném "power management" apod.

Také SuperIO čip má pin PME#, což je v jeho případě výstup. Tento sdružuje interní signály SuperIO čipu, dílčí interní PME# větévky, schopné probudit počítač - tradičně třeba od sériových UARTů (on-chip bloky uvnitř SuperIO) ale ono to reálně vypadá, že pomalu kterékoli zařízení uvnitř SuperIO má schopnost počítač probudit. Podle popisů konfigurací jednotlivých on-čip periferií uvnitř SuperIO se zdá, že PME# je navázán na IRQ výstup dané periferie, a tedy jeho přesná funkce závisí dále na konkrétní konfiguraci zdrojů přerušení uvnitř dané jednotlivé periferie. Třeba sériový port umí generovat interrupt na základě několika zdrojů/událostí. Buzení počítače se tradičně dělo na základě diskrétního modemového vstupu "ring" (vyzvánění = někdo nám volá).

Vedle "legacy PC" periferií uvnitř SuperIO, a klasicky třeba PCI síťovek (WoL), se umí počítač probudit také podle některých časovačů (modernější RTC, HPET).

Velmi na okraj připomeňme, že v dnešní době je SuperIO šváb (v notebooku jeho příbuzný Embedded Controller) propojen se south bridgem datovou sběrnicí LPC, což vlastně zúžená ISA. (Hodně dávno skrz PCI, VL BUS nebo ISA.)
Tato sběrnice funguje jenom ve chvíli, kdy má čipset kompletní napájení = počítač je v bdělém stavu. Proto se věci okolo napájení signalizují "out of band", k tomu určenými diskrétními dráty.

Přesněji řečeno, takhle to bylo ještě v dobách PCI, a dodnes takto části motherboardu fungují.
Jak to ale funguje nativně na sběrnici PCI Express? To je sběrnice, která se vyznačuje silně redukovanou sadou vodičů, je sériová, třeba interrupty se signalizují jedině zprávami.

Pokud se podíváte na pinout slotu PCI-e, najdete signál WAKE#, což zní slibně. Ano přihořívá, ale ten obrázek není zdaleka kompletní.

Volně parafrázováno ze specifikace PCI-e (str.429, začátek kapitoly 5.3.3):
Mějme periferní zařízení, které má v úmyslu probudit svůj hostitelský počítač. Kýžená událost nastala, jdeme na to.
Jeho PCI-e uplink ale spí, PCI-e lane na upstream portu (linkový budič) nemá napájení, netikají hodiny, vládne ticho a tma. V první fázi proto musí periferie nějak vzbudit upstream PCI-e switch, resp. spíš rovnou celý motherboard. Toto může provést jedním ze dvou způsobů (nebo oběma):

  1. Přitáhnout k zemi signál (diskrétní drát) WAKE# a držet ho, dokud nenaběhne hlavní napájení
  2. Poslat skrz svůj TX datový pár PCI-e linky, na fyzické vrstvě, tzv. "beacon" = probouzecí signál. (Ve specifikaci str.384, kap.4.3.5.7.) Signál Beacon má obsahovat hrany v rozestupu 2 ns až 16 us (v tomto rozmezí má být střída log.0 a log.1) a v horizontu 16 us má být signál "stejnosměrně vyvážený". Čili Beacon je něco jako "libovolně rozcuchané a ošklivé NRZ", zhruba ve smyslu:
    BUDÍÍÍÍČÉÉÉÉÉÉÉÉÉÉÉK!!! KOŘENÉÉÉÉ, VSTÁÁVÉÉÉÉÉÉÉJ !!!
    Zdá se, že Beacon je už lehce překonaná záležitost: specifikace praví, že linky o rychlostech 5 a 8 GT/s (PCI-e 2.0 a 3.0) nejsou povinné Beacon podporovat.

Dále pak periferie může přikročit k druhé fázi: poslat nyní už živým stromem PCI-e vzhůru root bridgi zprávu PM_PME, případně se dále účastnit probouzecího tanečku (zdá se, že má ještě nějaké další volitelné dějství proti ovladačům zařízení apod.).

Různě po webu se lze dočíst, že věci nejsou až tak jednoduché. Zejména, pokud je třeba řešit návaznosti v ovladačích, pokud zároveň s probuzením periferie pošle interrupt apod. Možná je ale důležité především to, že se počítač vůbec probudil. Která periferie budíček poslala, to pro spoustu použití možná není moc podstatné - OS se vzbudí, příslušná serviska prohrábne načasované úlohy, rozmyslí se co dál, pokud byl počítač jenom uspaný tak user-space software visící na zařízeních začne zkoumat, jestli není něco nového apod. Tohle přeci nemusí/nemá řešit ovladač zařízení.

Softwarová konfigurace probouzení

V hardwaru je několik míst, kde je třeba cosi odšpuntovat, aby probouzení fungovalo. Jsou toho řekněme 3 úrovně:

Dokumentace PCI a čipsetů k tomu obvykle říká, že tyto konfigurační volby mají ignorovat signál RESET (nemají zapomenout konfiguraci), což se týká i situace, kdy deska projde stavem stand-by.
To prakticky znamená, že příslušné registry mají být napájené větví +5VSB. A taky z toho plyne, že při odpojení napájecí šňůry se konfigurace ztratí - až na případné výjimky, které jsou podepřené baterkou (ale takové snad ani nejsou) nebo mají svoji konfigurační EEPROMku, kterou čip načte okamžitě po přivedení napájení (typicky síťové čipy).

Povolit či zakázat jednotlivé konfigurovatelné bity/flagy může buď BIOS nebo operační systém. Otázkou je jejich vzájemná koordinace a úcta.
Obecně má BIOS přístup ke všem konfigurovatelným věcem v čipsetu, a některé na konci POSTu zamkne aby další software (OS, včetně ovladačů) už s nimi nepohnul.
Nicméně se zdá, na základě praktických poznatků uživatelů napříč internety, že BIOS obecně nekazí operačnímu systému konfiguraci probouzecích "tlačítek" v čipsetu - ačkoli by mohl, pokud operační systém při vypnutí/usnutí košer zavolá službu BIOSu nebo nějakou ACPI metodu.

Staré BIOSy mívaly globální PME# enable, případně povolení probouzení od jednotlivých "legacy" periferií v SuperIO, které nejsou PCI zařízeními, nemají PCI config space a proto nejsou příliš konfigurovatelné z vyššího OS. Poslední dobou jsou BIOSy naopak vysloveně skoupé na konfiguraci per-slot vlastností PCI(-e) - a že třeba konfigurace ASPM by se často dost hodila. Takže nepřekvapí, že v BIOSu nelze nastavit zmíněné generické per-device flagy druhé úrovně v PCI config space (přestože i na ně by BIOS klidně dosáhl, kdyby chtěl). Tato konfigurace zůstává odemčená pro generický přístup z OS. A snad až na výjimky (snad sériový port, nebo síťovky doprovázené option ROMkou) BIOS nesahá na specifickou konfiguraci "zdrojů PME#" uvnitř periferních zařízení. (Čest výjimkám mezi BIOSy, které jsou podrobněji konfigurovatelné. Občas člověk potká zajímavý kousek na značkovém HW nebo i na slušném "neznačkovém" motherboardu.)
I pokud se povede nastavit nějaké probouzecí volby v BIOSu, třeba ohledně SuperIO (sériové porty), je třeba mít na paměti, že tato konfigurace se nejspíš ztratí při odpojení napájení, a obnoví se až po dalším průchodu POSTem. Tzn. pokud počítač po přivedení napájení zůstane ve stavu "ATX power off" (S5), což si SuperIO pamatuje protože tato funkce je podepřená baterkou, patrně nepůjde probudit sériovým portem, pokud to není factory default daného čipu (protože příslušný registr závisí na +5VSB). Této věci se obvykle netýkají "straps" ať už fyzické (alternativní funkce pinů) nebo "soft straps" (v nějaké EEPROMce - konkrétně SuperIO ale žádnou nemá).

Pod Windows je v device manageru na PCI zařízeních zhusta k vidění konfigurovatelná fajfka "povolit zařízení probouzet počítač".
Detailní konfigurace "zdrojů událostí pro probuzení" je věcí ovladačů nebo doprovodných utilit, které jsou HW-specifické pro danou periferii. Například na základě jakých druhů paketů má síťovka se zapnutou funkcí WoL počítač probudit. Pokud mohu soudit, na sériovém portu toho člověk pod Windows moc nenakonfiguruje, protože odmaskování konkrétních zdrojů interruptu v UARTu si generický ovladač dělá po svém a nelze to uživatelsky či programově konfigurovat.

Konkrétně síťové karty majú své špecifiká.
Klasická stand-alone síťová karta má malou konfigurační EEPROMku, (93c46, 24c01 apod) ve které je MAC adresa, nastavení rychlosti/duplexu, WoL a dalších věcí. Lepší síťovky mívaly také flashku (cca do 32 kB), ve které byl uložen BIOSový modul zvaný "option ROM", který si hostitelský BIOS natáhne při POSTu. K síťovkám se tradičně dodává stand-alone uživatelská utilita, která umí upravit konfigurovatelné atributy (a obvykle taky integrátorská utilita, která umí změnit i MAC adresu.)
Ovšem pozor: síťovky integrované na motherboardu nemívají option ROM ve vlastní malé flashce, ale integrovanou v hostitelském BIOSu. Dokonce nemusí mít ani konfigurační EEPROMku, pokud do nich MAC adresu nasype při POSTu hostitelský BIOS - ale taková síťovka je problematicky použitelná pro WoL (po studeném startu nebude mít síťovka MAC adresu.)
Nastavení WoL lze jistě zařídit i v operačním systému, pokud má ovladač příslušné volby - ale toto si síťovka bude pamatovat pouze do výpadku napájení. Co má uloženo v konfigurační EEPROMce, to platí i po studeném startu.

Příhody z natáčení

Závěrem dvě příhody z natáčení:

PCI sběrnice se v průběhu let vyvíjela, od pradávné verze 1.0 přes 2.0, 2.1, 2.2, 2.3 až po nepříliš známou 3.0. Proto si někteří výrobci motherboardů a karet vykládají význam některých pinů různě, případně "reserved" piny nekorektně uzemní apod. (Stanou se i horší přehmaty, ale o tom kdyžtak u piva.)
Například bylo nebylo, existovala periferní karta, jejíž výrobce si patrně špatně vysvětlil logiku PME#, a proto příslušný pin na kartě spojil s +3.3V, asi jako že "já přece rozhodně počítač budit nebudu". No a když se taková karta zasunula do motherboardu, který PME# ctil, tak milý počítač nešel vypnout! Po vypnutí tlačítkem nebo softwarově z OS počítač jenom krátce mrknul LEDkami a začal znovu startovat. Proč? Protože silová větev 3.3V se po vypnutí stroje rychle vybila a stáhla PME# ssebou pod log.0. Čímž se počítač znovu nastartoval.
Workaround: zakázat v BIOSu PME#, nebo přelepit PME kontakt na kartě izolepou.

Jiná humorná příhoda: bylo nebylo, v jedné skládačkové PICMG sestavě (pasivní backplane s 14 sloty, do něj zasunutá CPU karta) osadil zákazník asi tři dvouportové optické síťové karty s čipy AMD. Tyto čipy měly trvale zapnutou funkci WoL - snad i šla softwarově vypnout, ale jenom do tvrdého odpojení napájení. Po vytržení "ze zdi" a novém přivedení napájení počítač nechtěl nastartovat. LEDka indikující přítomnost +5VSB mžourala. Tuším se dal nastartovat "drátem" (tvrdým zkratem PS_ON na zem.) Důvod? Každá ze tří optických síťovek žrala ve stand-by díky WoL asi 1A. Plus něco si bral motherboard. Použitý zdroj odpovídal ATX 2.0, jeho větev +5VSB uměla 2A.
Workaround: přelepit napájení 5VSB na kartách izolepou. Zdroj ve formátu PS/2 s podporou víc jak 2A +5VSB nebyl k dispozici. Serverové zdroje umí víc, ale jsou rozměrnější. K čipům AMD buď neexistovala konfigurační utilita pro jejich doprovodné EEPROM, nebo tuto volbu neposkytovala... prostě tudy cesta taky nevedla.

A to by asi pro dnešek stačilo...


Sepsal: František Ryšánek (rysanek [AT] fccps [dot] cz)