Ahojte. Na thinkpade T420 by som chcel mať možnosť vypnúť a zapnúť ultrabay mechaniku bez reštartu a chodenia do biosu.
Vypnutie je jednoduché, stačí zápis do súboru /sys/bus/platform/devices/dock.1/undock. Reverznú operáciu (dock) som nenašiel, takže po vypnutí je mechanika mŕtva kým ju nevytiahnem z notebooku a znovu nezapojím.
Zápis do spomenutého súboru spustí ACPI metódu _SB.PCI0.SAT1.PRT1._EJ0 s parametrom 1. Skúšal som ručne spustiť metódu s parametrom 0 (echo "\_SB.PCI0.SAT1.PRT1._EJ0 0" > /proc/acpi/call), ale nič sa nestalo.
Príslušné dekompilované Intel ACPI Source Language (ASL) tabuľky prikladám v súbore.
Je možné mechaniku naštartovať softvérovo?

Toto si neskusal? https://wiki.archlinux.org/index.php/ThinkPad_docks#Using_dockd
V tom linku sa riesi monitor. Skus si to nabuduce precitat pred pastnutim.
Dockd počúva na acpi event, ktorý v mojom prípade príde len keď odpojím a pripojím mechaniku. Ja potrebujem donútiť bios, aby znovu preskenoval zariadenia bez fyzického odpojenia.
O to sa stara kernel (prebera kontrolu nad hardverom a BIOSOM).
Linux kernel prebera plne nahradza BIOS pri spustani.
Linux nenahrádza BIOS/UEFI. Ten beží stále nad operačným systémom a dá sa s nim komunikovať cez ACPI rozhranie. Kernel pri undock requeste zavolá metódu _EJ0 príslušného podsystému v ACPI. V tom momente preberá riadenie BIOS/UEFI a tu sa dostávame k dekompilovanému kódu, ktorý som priložil. Ak zavolám metódu eject (_EJ0) s parametrom 0 čakal by som, že urobí reverznú operáciu ejectu, ale to nerobí. Podľa kódu mám pocit, že by sa to malo dať poslaním špeciálneho kódu pre embedded controller a následným obnovením napájania pre SATA ak to EC neurobí automaticky.
Doplňujúce informácie:
Metóda
\_SB.PCI0.SAT1.PRT1._EJ0podľa ssdt3.dsl volá\_SB.PCI0.LPC.EC.BEJ0Method (_EJ0, 1, NotSerialized) // _EJx: Eject Device, x=0-9 { \_SB.PCI0.LPC.EC.BEJ0 (Arg0) }Tá je definovaná takto, ale neviem, ktorá časť je zodpovedná za vypnutie radiča a ani ako ho znovu zapnúť.
Method (BEJ0, 1, NotSerialized) { If (Arg0) { BDIS () \BHDP (0x01, 0x00) BSTS = 0x01 If (BHKE) { BHKE = 0x00 \_SB.PCI0.LPC.EC.HKEY.MHKQ (0x3003) } } Else { BSTS = 0x00 } }Evidentne však v podmienke else, kde by sa mal znovu inicializovať robí omnoho menej.
Otočil by som sa na tohoto človeka, s tým ti mi bežní smrteľníci ťažko pomôžeme.