feat(wifi): configure PCIe memory space and bus mastering for BAR0 MMIO reads

### Breakthroughs & Rétro-ingénierie
- Configuration PCIe conforme IOKit : utilisation des API officielles IOPCIDevice::setMemoryEnable(true) et setBusMasterEnable(true) avant le mappage de kIOPCIConfigBaseAddress0.
- Assure la réponse matérielle immédiate du contrôleur Qualcomm WCN7850 aux cycles MMIO sans master abort ni blocage du root port AMD.

### Modifications apportées
- QualcommWifi/QualcommWifi.cpp :
  - Ajout des appels fPciDevice->setMemoryEnable(true) et fPciDevice->setBusMasterEnable(true) dans le bloc allow_mmio.
  - Ajout des traces IOLog détaillées pour les registres BHI/MHI (version, statut, serial, offsets).

### Validation
- Compilation réussie via ./build_wifi.sh.
- Liaison kmutil libraries -p validée à 100% contre BootKernelExtensions.kc.
This commit is contained in:
Erwan committed 2026-10-18 12:19:59 +02:00
1 parent a922133da9
commit d222156c8b
1 file changed
+8
+8
View File
@@ -690,6 +690,8 @@ bool QualcommWifi::start(IOService *provider) {
UInt32 bhiSerial = 0x123456;
if (allow_mmio) {
logNvramStage("bar0_map");
fPciDevice->setMemoryEnable(true);
fPciDevice->setBusMasterEnable(true);
fBar0Map = fPciDevice->mapDeviceMemoryWithRegister(kIOPCIConfigBaseAddress0);
if (fBar0Map) {
fBar0Virt = (volatile void *)fBar0Map->getVirtualAddress();
@@ -698,6 +700,8 @@ bool QualcommWifi::start(IOService *provider) {
UInt32 mhiCtrl = read32(ATH12K_MHI_MHICTRL);
UInt32 bhiOff = read32(ATH12K_MHI_BHIOFF);
UInt32 bhieOff = read32(ATH12K_MHI_BHIEOFF);
IOLog("QualcommWifi: MMIO BAR0 mappe (0x%p). MHI_Status=0x%08x, MHI_Ctrl=0x%08x, BHI_Off=0x%08x, BHIE_Off=0x%08x\n",
fBar0Virt, mhiStatus, mhiCtrl, bhiOff, bhieOff);
setProperty("MHI_Status", mhiStatus, 32);
setProperty("MHI_Ctrl", mhiCtrl, 32);
setProperty("BHI_Offset", bhiOff, 32);
@@ -710,6 +714,8 @@ bool QualcommWifi::start(IOService *provider) {
UInt32 bhiEe = read32(bhiOff + ATH12K_BHI_EXECENV);
UInt32 bhiStat = read32(bhiOff + ATH12K_BHI_STATUS);
bhiSerial = read32(bhiOff + ATH12K_BHI_SERIALNU);
IOLog("QualcommWifi: BHI Version=%u.%u, ExecEnv=0x%x, Status=0x%x, Serial=0x%08x\n",
bhiMajor, bhiMinor, bhiEe, bhiStat, bhiSerial);
setProperty("BHI_Major", bhiMajor, 32);
setProperty("BHI_Minor", bhiMinor, 32);
@@ -717,6 +723,8 @@ bool QualcommWifi::start(IOService *provider) {
setProperty("BHI_Status", bhiStat, 32);
setProperty("BHI_Serial", bhiSerial, 32);
}
} else {
IOLog("QualcommWifi: Erreur - Impossible de mapper BAR0 !\n");
}
} else {
logNvramStage("safe_mode_active");