System mi nenachazi zarizeni (lehky uvod do troubleshootingu detekce zarizeni).
Dan Lukes
dan at obluda.cz
Mon May 11 18:23:54 CEST 2020
Pred chvili jsem v jinem emailu lehce nactrtnul jak vypada PCI sbernice
v pocitaci a jak na ni FreeBSD nachazi zarizeni a a hleda pro ne ovladace.
Ted se chci povenovat situaci kdy se nejake zarizeni nenajde a my
hledame co je spatne (nasledne proc a nasledne jak to opravit).
Jednodussi varianta je, kdyz nam system nabehne do alespon tak funkcniho
stavu, ze mame prikazovou radku, dokazeme spustit pciconf -lvb, ve
vzniklem vypisu vidime zairzeni, ktere hledame, ale jmeno zarizeni
vypada jako "noneX" kde X je nejake cislo.
Treba takhle:
> none2 at pci0:0:31:3: class=0x0c0500 card=0x1c228086 chip=0x1c228086 rev=0x05 hdr=0x00
> vendor = 'Intel Corporation'
> device = '6 Series/C200 Series Chipset Family SMBus Controller'
> class = serial bus
> subclass = SMBus
> bar [10] = type Memory, range 64, base 0xf7c01000, size 256, enabled
> bar [20] = type I/O Port, range 32, base 0x580, size 32, enabled
To znamena, ze system zarizeni nasel, uspesne mu priradil pozadovane
adresni bloku - jen pak pro nej nenasel ovladac.
V lepsim pripade dokonce vite jaky vladac by zarizeni mel ovladat - pak
je prakticky jiste, ze tento ovladac v systemu proste nemate.
Nedopatrenim vam vypadl z konfigurace kernelu (pokud si prekladate
vlatni), nenahravate ho dynamicky v loader.conf, po vypadku napajeni a
poskozeni disku vam soubor s ovladacem fsck smazlo, po upgrade zustal v
systemu modul ovladace z predchoziho systemu, chybi nejaky uplne jiny
modul na nemz je ale tento ovladac zavisly ...
Resenim je zkonstrolovat, ze ovladac je kde ma byt (v kernelu, v
loader,conf a pod) a podivat se na zaznam bootu systemu - pokud ovladac
nebyl nalezen, nepatri verzi k danemu systemu nebo nema pozadovane
zavislosti k dispozici, melo by to tam byt napsane.
Reseni je v tomhle pripade asi zrejme.
Horsi je, kdyz nevime jaky ovladac presne by mel zarizeni obsluhovat.
Zde je klicovou informaci vendor_id/device_id (uvedene v obracenem
poradi na radku chip="). Jednak se muzete zaeptat Googlu na
"FreeBSD chip=0x1c228086"
pri trose stesti najdete nekoho kdo resil stejny problem a pri trose
stesti tam najdete i radu jaky ovladac pouzit. Nekdy je uspesnejsi dtaz,
kde se odentifikace rozdeli, tedy
"FreeBSD 8086 1c22"
Hrdy bojovnik to ale nejdriv zkusi zvladnout sam, tak, ze zkusi ve
zdrojacich ovladacu najit identifikaci zarizeni:
> grep -iR 1c22 /usr/src/sys/dev
Dostane:
> /usr/src/sys/dev/ichsmb/ichsmb_pci.c:#define ID_CPT 0x1c22
> /usr/src/sys/dev/ispfw/asm_2500.h: 0x31d20370, 0x2231c222, 0xe0260790, 0xf5e0a3fa,
> /usr/src/sys/dev/bce/if_bcefw.h:0x196c00, 0x187400, 0x25e2ffee, 0x1c22025,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x0000f300, 0x0dc00000, 0x0000e180, 0xc8a10420, 0x00004901, 0x00001c22,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x000083f8, 0x0f400000, 0x0000e180, 0xc721103f, 0x00006003, 0x00001c22,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00006180, 0xc8a1cc39, 0x00004901, 0x00001c22, 0x00009583, 0x10400000,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00001900, 0x83800e38, 0x00009283, 0x81408000, 0x00006189, 0x0801c220,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00006110, 0x88b19e33, 0x00006111, 0x0801c222, 0x0000e110, 0x00000001,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00004901, 0x00001c22, 0x00009583, 0x0e400000, 0x00009988, 0x04110039,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00008080, 0x0801c220, 0x00006900, 0x80001a20, 0x00001582, 0x88001220,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x000021b6, 0x01802000, 0x00007930, 0x00211c22, 0x00000980, 0x000053eb,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x8c11c22f, 0x00009100, 0x8bc07a30, 0x0000e780, 0x0bc1ac30, 0x0000a000,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x0303c000, 0x00009999, 0x00002ad7, 0x0000f019, 0x00031c22, 0x00009583,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x6161c22c, 0x0000a101, 0x6151422c, 0x00002102, 0xffffffff, 0x00007f97,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x6161c22a, 0x0000a101, 0x50864e0a, 0x00007300, 0x0a100800, 0x00001980,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x0000e000, 0x0c01c221, 0x00002100, 0x00002097, 0x00007430, 0xea39a61e,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x0000d000, 0x00390800, 0x00008000, 0x07400a38, 0x0000e198, 0x0c01c221,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00006283, 0x0c01c223, 0x0000a100, 0x81840000, 0x0000e188, 0x81800000,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x0000e000, 0xc1401739, 0x00006283, 0x0c01c223, 0x0000a100, 0x81840000,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00000980, 0x01001c22, 0x00009283, 0xffffffff, 0x00007f86, 0x00006a5b,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x00005684, 0x00000002, 0x00008480, 0xaf801c22, 0x0000f88f, 0x03000001,
> /usr/src/sys/dev/qlnx/qlnxe/ecore_init_values.h: 0x000081ec, 0x07000000, 0x000081f4, 0x07800000, 0x000081fc, 0x01001c22,
> /usr/src/sys/dev/qlnx/qlnxe/reg_addr.h:#define CAU_REG_IGU_CMD_FIFO
To znamena, ze moznymi kandidaty jsou ichsmb, ispfw, bce, qlnx. Vzhledme
k tomu, ze zarizeni se jmenuje "SMBus Controller" tak ja bych okamzite
sel po ichsmb, ale resenim je o proste nahrat (pokud uz v systemu
nejspou) vsechny. Samozrejem postupne. Pozor, u nekterych zarizeni sice
existuje loadable modul, ale kdyz ho nahrajete az za behu, uz zarizeni
nenajde. Takze pokdu selzou vsechny pokusy s kldload, napiste napravani
modulu do loader.conf tak, aby se nahraly jeste pred startem systemu.
Ja ale davam "kldload ichsmb", na konzoli se objeci:
> ichsmb0: <Intel Cougar Point SMBus controller> port 0x580-0x59f mem 0xf7c01000-0xf7c010ff irq 18 at device 31.3 on pci0
> smbus0: <System Management Bus> on ichsmb0
a uspech potvrzuje i pciconf -vlb:
> ichsmb0 at pci0:0:31:3: class=0x0c0500 card=0x1c228086 chip=0x1c228086 rev=0x05 hdr=0x00
> vendor = 'Intel Corporation'
> device = '6 Series/C200 Series Chipset Family SMBus Controller'
> class = serial bus
> subclass = SMBus
> bar [10] = type Memory, range 64, base 0xf7c01000, size 256, enabled
> bar [20] = type I/O Port, range 32, base 0x580, size 32, enabled
Ke skemrani u Googlu se uchylim teprve pokud to takhle jednoduse vyresit
nejde.
Dosud byla rec o situaci, kdy spravny ovladac pro FreeBSD existuje, jen
ho z nejakeho duvodu nemame korektne pritomny. Potiz ale muze byt v tom,
ze jsme si koupili nejaky hodne novy stroj a v nem je nejaka nova
varianta chipu, kterou stavajici ovladace neznaji.
Zde uz se dostavame do oblasti "odhadu, pokusu a vlivu stesti". Rada
ovladacu poznava "sva" zarizeni vyhradne podle kombinace
vendor_id/device_id. Nezridka je cely problem v tom, ze v_id/d_id naseho
zarizeni "proste jen neni v seznamu" a proto se k nemu existujici
ovladac nezna.
Staci tedy do zdrojoveho kodu ovladace identifikaci doplnit a muze byt
vyreseno. nebo taky ne, pokud novy chip neni puvodnim podobny dost a
ovladac s nim ve skutecnosti pracovat nebude umet (prestoze ho donutime
si myslet, ze ano). Aniz bych vas chtel strasit, tenhle "postup na tupo"
ma i hypoteticka rizika - v krajnim pripade muze dojit i ke zniceni
hardware. realne riziko je velmi male, ja sam tenhle typ uprav delam bez
velkeho rozmysleni, ale pokud se neco stane, nerikejte, ze jsem vas
nevaroval.
Nechci se venovat tomu jak najdete misto kam v kodu ovladace tu
identifikaci napsat. Pokud jen trosicku programujte nebo mate nadani,
pak vhodne misto vetsinou zretelne uvidite. Pokud jste nikdy cizi
programy necetli, pak je to samostatne tema a to sem ted nechci tahat.
Specialnim a spise raritnim pripadem problemu je, kdy se vam na zarizeni
chyti ovladac, ale ne ten, ktery by mel. Hardwarova zarizeni totiz ani
nahodou nejsou chyb prosta. Neni az ta vzacne, ze zarizeni, ktere o sobe
deklaruje podporu nejakeho API toto API neimplementuje korektne a
ovladac musi rozpoznat, ze na "tohle zvire je treba mluvit trochu
jinak". Vyskytuji se pripady, kdy zarizeni, ktere neni bridge
prohlasije, ze jim je (a kvuli tomu mu system priradi ovladac pro
bridge, ktery ale samozrejme nefunguje) - ale taky situace obracene,
bridge v konfiguraci preda, ze bridge neni (a pokud na to system
neprijde, tak mine vsechny sbernice, ktere za timto bridgem jsou).
Vetsina pripadu tohoto typu vznika u velmi noveho hardware (pripadne u
nejakeho raritne se vyskytujiciho) a resenim je vlastni uprava
zdrojoveho kodu (aby se k zarizeni nehlasil ovladac, ktery nema a/nebo
hlasil ten, ktery ma). U bezneho a starsiho hardware se to nedeje proto,
ze na problem uz nekdo prisel a potrebne "vyjimky" uz v kodu systemu jsou.
V pristim (poslednim) emailu se budu venovat variante, ze pocitac
konkrenti koncove zarizeni (nebo celou sbernici) vubec nevidi.
Dan
More information about the Users-l
mailing list