IOPCIFamily 2.7 Mountain Lion

Inauguriamo questo blog con niente popodemeno che l’IOPCIFamilynecessario (o almeno lo è stato per me) per installare Mountain Lion su Acer Aspire 6930G.

Infatti questo kext (o driver) riconosce e configura le periferiche del PC come schede di rete, chipset scheda madre, scheda video ecc ecc.

Il file in questione è stato adattato dalla versione 2.6.1 alla 2.7 da netkas che, attraverso modifiche al codice sorgente, lo ha reso compatibile con Mountain Lion. Ma voi vi starete chiedendo:

“E perché mai dovremmo usare questo invece che quello ‘originale’ di netkas?”

La risposta è semplice. Il driver presente in questo blog è stato ulteriormente modificato e personalizzato in base alle mie (e con un po’ di fortuna anche di chi sta leggendo in questo momento) esigenze. Infatti la mappatura della memoria viene forzata per certi “ponti” o bridge. Da una distro linux è facile capire cosa e dove scrivere i vari valori.

Per esempio, “lspci -vv” (comando dato in linux come root) mi dice quali sono i bridge, da cosa sono occupati e quali sono i valori per mappare la memoria.

Il file sorgente da modificare è “IOPCIConfigurator.cpp” della versione 2.6.1 (o 2.7 se usate quello di nektas). La stringa da individuare è la seguente:
void CLASS::pciBridgeProbeRanges( pci_dev_t bridge )

sotto di questa inseriamo una variabile booleana di controllo a piacere, tipo “fatto” dichiarandola in questo modo:
bool fatto = false;

fatto = false;

Questa variabile è indispensabile! Infatti ci consente di saltare passaggi non necessari.

Proseguiamo. Sostituiamo

{
configWrite16(bridge->space, kPCI2PCIIORange, 0xF0);
configWrite32(bridge->space, kPCI2PCIUpperIORange, 0);
configWrite32(bridge->space, kPCI2PCIPrefetchMemoryRange, 0xFFF0);
configWrite32(bridge->space, kPCI2PCIPrefetchUpperBase, 0);
configWrite32(bridge->space, kPCI2PCIPrefetchUpperLimit, 0);
bridge->deviceState = kPCIDeviceStateResourceWait;
}

 

con

if (!fatto && bridge->secBusNum == 1 && bridge->subBusNum == 1)
{
range = &bridge->ranges[kIOPCIRangeBridgeMemory];
range->start = 0xcc000000;
range->size = 0xceffffff - 0xcc000000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypeMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 2 && bridge->subBusNum == 4)
{
range = &bridge->ranges[kIOPCIRangeBridgeMemory];
range->start = 0xc0000000;
range->size = 0xc01fffff - 0xc0000000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypeMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 5 && bridge->subBusNum == 5)
{
range = &bridge->ranges[kIOPCIRangeBridgeMemory];
range->start = 0xc0400000;
range->size = 0xc06fffff - 0xc0400000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypeMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 7 && bridge->subBusNum == 7)
{
range = &bridge->ranges[kIOPCIRangeBridgeMemory];
range->start = 0xc0900000;
range->size = 0xc0bfffff - 0xc0900000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypeMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 9 && bridge->subBusNum == 9)
{
range = &bridge->ranges[kIOPCIRangeBridgeMemory];
range->start = 0xc0e00000;
range->size = 0xc10fffff - 0xc0e00000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypeMemory;
fatto = true;
}

fatto = false;

modificando i valori di range->start range->size prelevando i rispettivi valori dall’output del comando lspci --vv precedentemente salvato da linux.
Attenzione, quando prelevate i valori assicuratevi che i “secondary=xx” e i “subordinate=xx” siano giusti, cioè corrispondano ai “secBusNum=xx” e ai “subBusNum=xx”.

Ci spostiamo più in basso e cerchiamo

if (end > start)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = start;
range->size = end - start + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
}

e lo sostituiamo con

if (!fatto && bridge->secBusNum == 1 && bridge->subBusNum == 1)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = 0xd0000000;
range->size = 0xdfffffff - 0xd0000000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 2 && bridge->subBusNum == 4)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = 0xc0200000;
range->size = 0xc03fffff - 0xc0200000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
purkka = true;
}
if (!fatto && bridge->secBusNum == 5 && bridge->subBusNum == 5)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = 0xc0700000;
range->size = 0xc08fffff - 0xc0700000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 7 && bridge->subBusNum == 7)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = 0xc0c00000;
range->size = 0xc0dfffff - 0xc0c00000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
fatto = true;
}
if (!fatto && bridge->secBusNum == 9 && bridge->subBusNum == 9)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = 0xc1100000;
range->size = 0xc12fffff - 0xc1100000 + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
fatto = true;
}
if (!fatto && end > start)
{
range = &bridge->ranges[kIOPCIRangeBridgePFMemory];
range->start = start;
range->size = end - start + 1;
range->alignment = kPCIBridgeMemoryAlignment;
range->type = kIOPCIResourceTypePrefetchMemory;
}

Anche qui stessa cosa fatta sopra. Personalizziamo i valori di “range->size” e “range->start” (tranne gli ultimi)

ed infine spostiamoci poco più giù e sostituiamo

if (end > start)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = start;
range->size = end - start + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
}

con

if (!fatto && bridge->secBusNum == 1 && bridge->subBusNum == 1)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = 0x2000;
range->size = 0x2fff - 0x2000 + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
bridge->deviceState = kPCIDeviceStateResourceAssigned;
fatto = true;
}
if (!fatto && bridge->secBusNum == 2 && bridge->subBusNum == 4)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = 0x3000;
range->size = 0x3fff - 0x3000 + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
bridge->deviceState = kPCIDeviceStateResourceAssigned;
fatto = true;
}
if (!fatto && bridge->secBusNum == 5 && bridge->subBusNum == 5)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = 0x4000;
range->size = 0x4fff - 0x4000 + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
bridge->deviceState = kPCIDeviceStateResourceAssigned;
fatto = true;
}
if (!fatto && bridge->secBusNum == 7 && bridge->subBusNum == 7)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = 0x5000;
range->size = 0x5fff - 0x5000 + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
bridge->deviceState = kPCIDeviceStateResourceAssigned;
fatto = true;
}
if (!fatto && bridge->secBusNum == 9 && bridge->subBusNum == 9)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = 0x6000;
range->size = 0x6fff - 0x6000 + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
bridge->deviceState = kPCIDeviceStateResourceAssigned;
fatto = true;
}
if (!fatto && end > start)
{
range = &bridge->ranges[kIOPCIRangeBridgeIO];
range->start = start;
range->size = end - start + 1;
range->alignment = kPCIBridgeIOAlignment;
range->type = kIOPCIResourceTypeIO;
}

Sempre la stessa cosa. Modifichiamo tutti i range->start range->size tranne gli ultimi.

Ovviamente questa non vuole essere una guida per chi non sa nulla di programmazione. Il post originale, basato sui sorgenti di Snow Leopard, può essere raggiunto a questo indirizzo.

Questo è il download per il mio: IOPCIFamily 2.7 + AppleACPIPlatform rollback

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.