Files
i2c-imc-skylake/docs/vendor-crossref-aura-re.md
T
Simone 01685016df docs: cross-check col reverse engineering dei binari ASUS
Confronto fra la classe gs::IntelSKLXSmbus dei binari Armoury Crate e il nostro
driver: nessuna divergenza, stessa mappa registri, registro per registro,
device PCI 0x2085 compreso.

Il valore non è una correzione ma una seconda conferma indipendente su
un'interfaccia che il datasheet Intel non documenta per la PCU function 5 — la
prima era PawnIO.Modules. Più tre dati che nei nostri doc non c'erano.

Fonte dichiarata come claim di terzi ma verificabile (raw/ e disasm/ nella
cartella non-git su partizione Windows), con due spot-check su due riscontrati
sul disassemblato primario. Nessuna modifica al codice necessaria.
2026-08-31 01:31:48 +02:00

9.6 KiB

Cross-check col reverse engineering vendor ASUS (aura-re) — 2026-08-26

Esito: nessuna divergenza. Il binario ASUS usa la stessa mappa registri del driver, registro per registro. Il valore di questo confronto non è una correzione: è la seconda conferma indipendente su un'interfaccia che il datasheet Intel non documenta per la PCU function 5 — la prima era PawnIO.Modules (SmbusIntelSkylakeIMC.p, TODO.md §Notes) — più tre dati che nei nostri doc non c'erano.

Fonte /media/simone/OS/Users/Simone/Desktop/aura-re — analisi statica dei binari Armoury Crate, prodotta il 2026-08-26 (cartella non-git, sulla partizione Windows)
Grado di fiducia claim di terzi, ma verificabile: raw/ ha i binari, disasm/ il disassemblato completo
Spot-check fatto 2 su 2 riscontrati sul disassemblato primario, non sul solo testo — vedi §4
Ricaduta sul codice nessuna modifica necessaria

1. Confermato — mappa registri identica

Confronto fra aura-re/03-smbus-backends.md (classe gs::IntelSKLXSmbus) e i2c-imc-skylake.c.

Elemento ASUS gs::IntelSKLXSmbus Nostro driver Esito
Device PCI DID 0x2085 PCU_DEVICE 0x2085 (:95) identico
Canale 0 — CMD / STAT / DATA 0x9C / 0xA8 / 0xB4 :110-112 identico
Canale 1 — CMD / STAT / DATA 0xA0 / 0xAC / 0xB8 :113-115 identico
CMD [7:0] BA, offset nel device GENMASK(15,0) low byte (:132) identico
CMD [14:8] SA, indirizzo 7 bit :130-131 identico
CMD [15] WRT, 1 = scrittura WRITE_OPERATION BIT(15) (:154) identico
CMD [17] WORD, accesso 16 bit WORD_BIT BIT(17) (:138) identico
CMD [19] TRIGGER GO_BIT BIT(19) (:136) identico
CMD [20] TSOD poll (loro: [inferenza]) TSOD_ACTIVE_BIT BIT(20) (:137) concorde
STATUS, letto come byte [0] BUSY [1] ERROR [2] read done [3] write done :164-167 identico
DATA — scrittura byte [23:16] raw << 16 con raw a 8 bit (:571-572) identico
DATA — scrittura word [31:16] swab16(*value) << 16 (:571-572) identico
DATA — lettura [15:0] raw & 0xffff / & 0xff (:599-600) identico

Perché conta. La cover letter dice che il datasheet Intel (rif. 614073 §3.1.8) descrive un'altra interfaccia, sulla channel function, e non copre la function 5. Il HAL ASUS pilota la function 5 esattamente con la nostra codifica: la mappa non è più solo "misurata sul mio hardware".

2. Differenze di condotta — nessuna è un difetto nostro

  • Bit 29 — ASUS non lo scrive mai: legge il CMD e lo maschera con and dword ptr [r8], 0xfffe0000, cioè conserva tutti i bit ≥ 17 e ricostruisce solo [16:0]. Il bit 29 sopravvive perché lo ha già messo il firmware. Noi lo scriviamo esplicitamente (COMMAND_PREFIX, :155) e abbiamo misurato che azzerandolo la transazione fallisce con ERROR. Le due osservazioni sono coerenti; è un secondo dato per la domanda "cos'è il bit 29" se un reviewer la fa.
  • Gate TSOD — ASUS si limita a rifiutare la transazione se CMD bit20 == 1 (funzione 0x14001D720, chiamata una sola volta via std::call_once). Noi facciamo di più: check di SMBCNTL.TSOD_POLL_EN a probe (:783) e azzeramento + ripristino del bit 20 su tutti i canali per ogni transfer (imc_prepare_xfer, :517-548). Il nostro è strettamente più cauto — niente da importare.
  • PNTR_SEL (bit 18) — ASUS non lo usa affatto. La scoperta del 27/07 resta solo nostra: nessuna conferma, ma nemmeno contraddizione.
  • Timeout — ASUS: 1000 iterazioni con attesa di ~237 µs (0xED) ≈ 237 ms. Noi: poll 10 µs, timeout 50 ms idle / 200 ms GO / 50 ms done. Nessuna azione.

3. Dati nuovi, che nei nostri doc non c'erano

  • 🚨 Tabella CPUID → Device ID del vendor (0x140001510, tab. in 03-smbus-backends.md):

    CPUID >>4 Famiglia DID cercato
    0x306F Haswell-E / EP 0x2FA8
    0x406F Broadwell-E / EP 0x6FA8
    0x5065 Skylake-X / Cascade Lake-X 0x2085
  • Il vendor conferma che i due layout non sono intercambiabili. Il ramo gs::IntelImcSmbus (Haswell/Broadwell) usa SMBSTAT 0x180 / SMBCMD 0x184 / SMBCNTL 0x188 con TRIGGER a [31], PNTR_SEL a [30], WORD a [29], WRITE a [27] — identico a i2c-imc di Lutomirski; il ramo SKL-X è la codifica compatta che usiamo noi. È l'argomento tecnico del perché serve un driver nuovo e non un'estensione di i2c-imc (fonte: aura-re/08-domande-aperte.md, §"IntelImcSmbus contro i2c-imc").

  • ENE a 0x27: il percorso vendor è write-only, e ora lo si legge nel codice ASUS, non in un commento di OpenRGB. Sessione 0xE1=0x01 + 0xE4=0x09, colori 0xEC/0xED/0xEE, commit 0xDD=0x64, 50 µs di attesa attiva fra una scrittura e l'altra, Sleep(1 ms) attorno all'apertura/chiusura, chiusura 0xE1=0x02 poi 0x03. Corrobora P2 (chiusa il 10/08) da una fonte indipendente.

  • Gli indirizzi RGB dei moduli vengono assegnati, non sono di fabbrica (EneRGBSDK::Dram_AssignAddress, base 0x48; GskillLogic::ChangeAddress). Quindi 0x27 è "l'indirizzo dopo l'inizializzazione", non un dato di targa — da tenere presente in ogni futura misura sull'ENE.

4. Spot-check sul disassemblato primario

Due claim presi a campione e riscontrati sul .asm, non sul testo del doc:

disasm/AacKingstonDramHal_x64.asm:337
  0x000140001550  b885200000   mov eax, 0x2085        # tabella CPUID->DID, voce SKL-X

disasm/AacKingstonDramHal_x64.asm:33438
  0x00014001d29f  4181200000feff   and dword ptr [r8], 0xfffe0000   # ReadByte: conserva
                                                                   # i bit >=17 (29 e 20)

5. 🚨 Vincolo: questo materiale non va su LKML

Deriva dal disassemblato di binari ASUS proprietari. Le affermazioni della patch e della cover letter restano fondate sulle nostre misure su hardware, che ci sono già e bastano. Il cross-check serve internamente (e in docs/submission/review-answers.md, gitignored), non come citazione nel thread upstream.

6. Ricadute fuori da questo progetto

  • furyrs — Kingston FURY: RGB a 0x58 (DDR4, base 0x57+1) e 0x60 (DDR5, base 0x5F+1); mode register 0x08: 0x53 'S' = controllo software, 0x44 'D' = default; detect = ReadWord 0x05/0x06/0x88/0x26 con 20 ms fra i passi. Detect del modulo RGB via SPD: manufacturer 0x0198 in SPD[0x140/0x141], flag RGB = SPD[0x168] bit 4 (pagina 1, SPA1 0x37). Fonte: aura-re/04-dram-kingston.md.
  • tuf-x299-aura — i LED della mobo non stanno sull'i801: stanno sul controller SMBus del Super I/O Nuvoton (0x2E/0x2F, LDN 0x0B, base da 0x62/0x63), con controller AURA82 a 0x9C 8 bit = 0x4E 7 bit e pacchetti da 65 byte con marker 0xEC. Spiegherebbe sia lo scan i801 muto sia OpenRGB a zero controller. Fonte: aura-re/05-mobo-aura.md, 06-porting-linux.md.

7. Cosa ho già letto nel disassemblato (per non rifarlo)

Analisi mia del 26/08 sulla vtable di gs::IntelSKLXSmbus (disasm/AacKingstonDramHal_x64.rtti.txt:17-30, 13 slot, base gs::Smbus ne ha 11 con 7 _purecall):

Slot VA Cosa fa davvero Ricaduta sul driver
1-4 0x14001D310 / D240 / D3E0 / D4A0 read/write byte e word già nostri
6 0x14001CD60 block read emulata: ciclo che chiama lo slot 4 (call [rax+0x20] = ReadWord) e impila 2 byte per giro in uno std::vector niente block hardware
7 0x14001CEB0 block write emulata: ciclo che chiama lo slot 3 (call [rax+0x18] = WriteWord), impacchettando 2 byte per giro idem
8 0x14001D560 write "nuda": CMD &= 0xfffc00ff (azzera [17:8], conserva BA [7:0], bit 18, 20, 29), poi SA in [14:8], WRT in [15], GO in [19]; nessun dato messo in DATA; indirizzo = arg1 + arg2 a 8 bit; chiude con WaitDone(isWrite=1). È il page-select SPD (SPA0/SPA1) che serve a leggere gli offset > 0xFF equivalente al nostro Send Byte, ma senza usare PNTR_SEL
12 0x14001D5D0 slot % 6 → indice in tabella a 0x14007F938, passo 4 mappa slot logico → indirizzo

Costruttore (0x14001A3C5-0x14001A496): crea esattamente due istanze, con (status, cmd, data) = (0xA8, 0x9C, 0xB4) e (0xAC, 0xA0, 0xB8). 🚨 Nessun altro offset del config space della function 5 viene toccato in questo percorso: niente registro nascosto da aggiungere al driver.

Conclusione: dal materiale letto finora non esce nessuna feature hardware che ci manchi. Le domande che potrebbero ancora cambiare il driver sono in TODO.md §V, item V3.

8. 🚨 Un claim di aura-re è sbagliato — verificato sul primario

aura-re/06-porting-linux.md §"Percorso 1" dice che «esiste già un'implementazione Linux funzionante: OpenRGB ha un driver SMBus per il Super I/O Nuvoton» e cita i2c_smbus/i2c_smbus_nuvoton_nct6775.cpp. Quel file non esiste. Su hw/OpenRGB-src a master 8c19428b (2026-08-08) l'unico backend Nuvoton è i2c_smbus/MacOS/i2c_smbus_nct6775.cpp — solo macOS, esattamente come dice già hw/tuf-x299-aura/TODO.md B2. Su Linux la strada resta il modulo out-of-tree i2c-nct6775 (openrgb-dkms) che espone un adapter i2c, non un backend interno di OpenRGB: meccanismo diverso, e in tuf-x299-aura è bloccato per decisione di Simone finché W27 è aperta.

Morale operativa: aura-re è forte dove disassembla (i claim con indirizzo VA reggono lo spot-check), debole dove riassume l'ecosistema Linux. Prendere i primi, verificare i secondi.