Nadpis jak z Blesku a pro zvědavce, kteří se chtějí dočíst, proč vlastně zabírají tolik, tak stačí se mrknout do komentářů:
https://www.phoronix.com/forums/forum/linux-graphics-x-org-drivers/amd-linux/945809-amd-s-kernel-graphics-code-is-approaching-one-million-lines?p=945831#post945831
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/plain/drivers/gpu/drm/amd/include/asic_reg/vega10/GC/gc_9_0_sh_mask.h?id=refs/tags/next-20170413
To je hrůza! Ten hlavičkovej soubor má přes 3 mega :-O
Ne, to opravdu není hrůza. Hrůza je, jak to pitomci psali.
Copak je to normální, mít x bloků po y makrech, kde se liší jenom číslovka v názvu makra?
- GRBM_STATUS_SE2, GRBM_STATUS_SE3
- CP_ROQ1_THRESHOLDS, CP_ROQ2_THRESHOLDS
- CP_ROQ_RB_STAT, CP_ROQ_RB1_STAT, CP_ROQ_RB2_STAT
- PA_SC_BINNER_EVENT_CNTL_0, PA_SC_BINNER_EVENT_CNTL_2, PA_SC_BINNER_EVENT_CNTL_3
- SX_DEBUG_BUSY, SX_DEBUG_BUSY[2..5] - 65LOC každý blok
- ...
Jednak to vypadá hnusně a je to nepřehledný, ale za další je jedna hodnota pro různý instance uvedená pokaždý jinde. A jak udělají funkci, která přistupuje k N kanálům na základě indexu, kde oba registry mají stejnou definci? Udělají tabulku konstant a používají pointerovou arimetiku, nebo na přiřazení čtyř instancí jednoho registru padne switch na 15LOC? Nebo switch neznají a narvou tam if-else, aby to ztížili kompilátoru?
Takhle prasácky se píše soft jenom ve dvou případech. Pokud je práce zadaná do Indie, nebo pokud je programátor placený za LOC (ale v tom případě by šlo ještě nahnat řádky vložením maker do maker a jejich dokumentací). V obou případech je to na převrtání konečníku špičatou botou.
Ta délka hrůza je. Tolik registrů v jednom HW jsem nikde neviděl. Co jsem se koukal do git next, tak nejdelší řádek má přes 160 znalů (při více jak 80 znaků ti spousta maintainerů odmítne patch).
V jednom 13MB headeru (! to je víc než má zkompilovaný kernel) je ta define hodnota zarovnaná na cca 110 znak a stejně jim to nestačilo, takže na pár řádkách jsou define hodnoty vyteklý ze zarovnání.
Odsazování mezerama. "//" komentáře (no ty mě nevadí, ale už mě s nima odmítli pár patchů). "BIF_BX_DEV0_EPF0_VF10_DOORBELL_SELFRING_GPA_APER_BASE_HIGH__DOORBELL_SELFRING_GPA_APER_BASE_HIGH__SHIFT" nechápu proč je tam ten string dvakrát.
Kdyby dali každej ten blok definů do samostanýho souboru a zkrátili mu jméno, tak by ušetřili tak 50+% místa.
Spousta těch definů je "shift" a "mask". Chci vidět jak ty 100+ znakový jména používaj pro vymaskování hodnoty z bitfieldu v nějakým registru :-D.
Teďka kdyby všechny ty registry použili v driveru, tak by se objem AMD DRM prakticky zdvojnásobil.
"K uvedenému treba dodať kód pre ovládanie výstupov AMD Display controlle (bývalý DAL), ktorý mal cca. 93 000 riadkov a nebude zaradený do jadra 4.12. Bez neho, alebo proprietárnej nadstavby AMDGPU v userspace tzv. AMDGPU-PRO, však nebude AMD VEGA môcť byť použitá inak ako výpočtová karta."
Toto je nepresne, nestaci jen ta userspace nadstavba, ty ovladace amdgpu-pro obsahuji i vlastni kernel modul ktery nahradi OSS amdgpu modul.