lunes, 2 de enero de 2012

Inyeccion en DSDT de la gráfica nVidiaG105M

Guia para inyección de Grafica nVidia.
PRIMERO:

Hemos de tener lo básico para empezar a inyectar... el DSDT, sin él no inyectamos nada en ninguna parte, es obvio. Por consiguiente debemos de tener el programita que lo extrae y para ello debemos descargarnos los siguientes:
- Descargar de www.osx86.es, el app DSDT SimpleEditor, es un muy buen editor del DSDT aunque para mi le falta algo para ser más intuitivo (hay más app interesantes que ahora no vienen a cuento pero que harán falta para otros o similares menesteres)
- Descarga el DSDTEditor de http://www.insanelymac.com/forum/ind...owtopic=223205, el DEDTEditor de Coniglio, este editor te servirá mucho para ver la estructura del DSDT puesto que lleva esa esa estructura en su margen derecho y esto lo hace muy comprensible, tiene otras ventajas que irás viendo sobre la marcha, para mi la mejor es que me deja trabajar en cualquier ordenados con Win, Ubuntu o OSX...
- Descargar el IORegitryExplorer
, para ver como el cham ha inyectado la gráfica e ir sacando los valores necesarios. El Cham debe tener el flag GraphicsEnabler=Yes
- Estas son alguna guias sueltas para ir consultando: en osx86.es, en TonyMacx86, en InsanelyMac (castellano), habrán más... pero estas están bien.

SEGUNDO:
Con cualquiera de los dos editores, extraemos el DSDT y nos lo guardamos como DSDT-original.aml e inmediatamente copiamos ese archivo de donde lo hemos guardado a un sitio seguro para no tocarlo jamas (dropbox, una emoria USB...).
Abrimos el IORegistryExplorer y buscamos donde está la gráfica, como ejemplo mirad donde he encontrado la mia y donde la identifico en mi dsdt con el DSDTEditor.



Se encuentra dentro del DevicePCI0/IXVE, también es importante que os fijeis el acpi-path IOACPIPlataformExpert:/_SB/PCI0@0/AppleACPIPCI/
POP3@100000"



Aqui vemos su estructura en el dsdt.aml
Ahora vamos a utilizar como base el código de la nVidia 9500 como base para nuestra inyección, este lo copio de la web de InsanelyMac, que además lleva la saida HDMI.



Es importante, la identificación de la dirección debe estar correcta, "IOACPIPlataformExpert:/_SB/PCI0@0/AppleACPIPCI/POP3@100000" que es igual a:Name (_ADR0x00010000)
Código DSDT:
Device (PCI0)
                {
                        
Device (PEGP)
                        {
                                
Name (_ADR0x00010000)
                                
Device (GFX0)
                                {
                                        
Name (_ADRZero)
                                        
Name (_SUNOne)
                                        
Method (_DSM4NotSerialized)
                                        {
                                                
Store (Package (0x16)
                                                        {
                                                                
"@0,compatible",
                                                                
Buffer (0x0B)
                                                                {
                                                                        
"NVDA,NVMac"
                                                                
},

                                                                
"@0,device_type",
                                                                
Buffer (0x08)
                                                                {
                                                                        
"display"
                                                                
},

                                                                
"@0,name",
                                                                
Buffer (0x0F)
                                                                {
                                                                        
"NVDA,Display-A"
                                                                
},

                                                                
"@1,compatible",
                                                                
Buffer (0x0B)
                                                                {
                                                                        
"NVDA,NVMac"
                                                                
},

                                                                
"@1,device_type",
                                                                
Buffer (0x08)
                                                                {
                                                                        
"display"
                                                                
},

                                                                
"@1,name",
                                                                
Buffer (0x0F)
                                                                {
                                                                        
"NVDA,Display-B"
                                                                
},

                                                                
"NVCAP",
                                                                
Buffer (0x18)
                                                                {
                                                                        
/* 0000 */      0x040x000x000x000x000x000x0b0x00,
                                                                        
/* 0008 */      0x040x000x000x000x000x000x000x07,
                                                                        
/* 0010 */      0x000x000x000x00
                                                                
},

                                                                
"VRAM,totalsize",
                                                                
Buffer (0x04)
                                                                {
                                                                        
0x000x000x000x20
                                                                
},

                                                                
"device_type",
                                                                
Buffer (0x0D)
                                                                {
                                                                        
"NVDA,GeForce"
                                                                
},

                                                                
"model",
                                                                
Buffer (0x0C)
                                                                {
                                                                        
"nVidia 9500"
                                                                
},

                                                                
"rom-revision",
                                                                
Buffer (0x1A)
                                                                {
                                                                        
"nVidia 9500 OpenGL Engine"
                                                                
}
                                                        }, 
Local0)
                                                
DTGP (Arg0Arg1Arg2Arg3RefOf (Local0))
                                                Return (
Local0)
                                        }
                                }
                        }

                        
Name (_HIDEisaId ("PNP0A03"))
                        
Name (_UIDZero)
                        
Name (_BBNZero)
                        
Method (_S3D0NotSerialized)
                        {
                                If (
LEqual (OSFL0x02))
                                {
                                        Return (
0x02)
                                }
                                Else
                                {
                                        Return (
0x03)
                                }
                        }

                        
Method (_STA0NotSerialized)
                        {
                                Return (
0x0F)
                        }

                        
Method (_CRS0NotSerialized)
                        {
                                
Name (BUF0ResourceTemplate ()
                                {
                                        
WordBusNumber (ResourceConsumerMinNotFixedMaxNotFixedPosDecode,
                                                
0x0000,                  // Granularity
                                                
0x0000,                  // Range Minimum
                                                
0x003F,                  // Range Maximum
                                                
0x0000,                  // Translation Offset
                                                
0x0040,                  // Length
                                                
,, )
                                        
IO (Decode16,
                                                
0x0CF8,                  // Range Minimum
                                                
0x0CF8,                  // Range Maximum
                                                
0x01,                      // Alignment
                                                
0x08,                      // Length
                                                
)
                                        
WordIO (ResourceProducerMinFixedMaxFixedPosDecodeEntireRange,
                                                
0x0000,                  // Granularity
                                                
0x0000,                  // Range Minimum
                                                
0x0CF7,                  // Range Maximum
                                                
0x0000,                  // Translation Offset
                                                
0x0CF8,                  // Length
                                                
,, , TypeStatic)
                                        
WordIO (ResourceProducerMinFixedMaxFixedPosDecodeEntireRange,
                                                
0x0000,                  // Granularity
                                                
0x0D00,                  // Range Minimum
                                                
0xFFFF,                  // Range Maximum
                                                
0x0000,                  // Translation Offset
                                                
0xF300,                  // Length
                                                
,, , TypeStatic)
                                        
DWordMemory (ResourceProducerPosDecodeMinFixedMaxFixedCacheableReadWrite,
                                                
0x00000000,              // Granularity
                                                
0x000A0000,              // Range Minimum
                                                
0x000BFFFF,              // Range Maximum
                                                
0x00000000,              // Translation Offset
                                                
0x00020000,              // Length
                                                
,, , AddressRangeMemoryTypeStatic)
                                        
DWordMemory (ResourceProducerPosDecodeMinFixedMaxFixedCacheableReadWrite,
                                                
0x00000000,              // Granularity
                                                
0x000C0000,              // Range Minimum
                                                
0x000DFFFF,              // Range Maximum
                                                
0x00000000,              // Translation Offset
                                                
0x00020000,              // Length
                                                
,, , AddressRangeMemoryTypeStatic)
                                        
DWordMemory (ResourceProducerPosDecodeMinFixedMaxFixedCacheableReadWrite,
                                                
0x00000000,              // Granularity
                                                
0x00100000,              // Range Minimum
                                                
0xFEBFFFFF,              // Range Maximum
                                                
0x00000000,              // Translation Offset
                                                
0xFFF00000,              // Length
                                                
,, _Y00AddressRangeMemoryTypeStatic)
                                })
                                
CreateDWordField (BUF0_SB.PCI0._CRS._Y00._MINTCMM)
                                
CreateDWordField (BUF0_SB.PCI0._CRS._Y00._LENTOMM)
                                
Add (AMEM0x00010000TCMM)
                                
Add (TCMM0x00010000TCMM)
                                
Subtract (0xFEC00000TCMMTOMM)
                                Return (
BUF0)
                        }

                        
Name (PICMPackage (0x16)
                        {
                                
Package (0x04)
                                {
                                        
0x001BFFFF,
                                        
Zero,
                                        
LNK0,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
Zero,
                                        
LNKA,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
One,
                                        
LNKB,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
0x02,
                                        
LNKC,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
0x03,
                                        
LNKD,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
Zero,
                                        
LNKA,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
One,
                                        
LNKB,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
0x02,
                                        
LNKC,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
0x03,
                                        
LNKD,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
Zero,
                                        
LNKA,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
One,
                                        
LNKB,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
Zero,
                                        
LNK1,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
One,
                                        
LNKD,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
0x02,
                                        
LNKC,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
0x03,
                                        
LNKA,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001FFFFF,
                                        
One,
                                        
LNKD,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001FFFFF,
                                        
One,
                                        
LNKD,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001FFFFF,
                                        
0x02,
                                        
LNKC,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
Zero,
                                        
LNKA,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
One,
                                        
LNKF,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
0x02,
                                        
LNKC,
                                        
Zero
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
0x02,
                                        
LNKC,
                                        
Zero
                                
}
                        })
                        
Name (APICPackage (0x16)
                        {
                                
Package (0x04)
                                {
                                        
0x001BFFFF,
                                        
Zero,
                                        
Zero,
                                        
0x16
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
Zero,
                                        
Zero,
                                        
0x10
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
One,
                                        
Zero,
                                        
0x11
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
0x02,
                                        
Zero,
                                        
0x12
                                
},

                                
Package (0x04)
                                {
                                        
0x0001FFFF,
                                        
0x03,
                                        
Zero,
                                        
0x13
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
Zero,
                                        
Zero,
                                        
0x10
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
One,
                                        
Zero,
                                        
0x11
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
0x02,
                                        
Zero,
                                        
0x12
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
0x03,
                                        
Zero,
                                        
0x13
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
Zero,
                                        
Zero,
                                        
0x10
                                
},

                                
Package (0x04)
                                {
                                        
0x001CFFFF,
                                        
One,
                                        
Zero,
                                        
0x11
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
Zero,
                                        
Zero,
                                        
0x17
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
One,
                                        
Zero,
                                        
0x13
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
0x02,
                                        
Zero,
                                        
0x12
                                
},

                                
Package (0x04)
                                {
                                        
0x001DFFFF,
                                        
0x03,
                                        
Zero,
                                        
0x10
                                
},

                                
Package (0x04)
                                {
                                        
0x001FFFFF,
                                        
One,
                                        
Zero,
                                        
0x13
                                
},

                                
Package (0x04)
                                {
                                        
0x001FFFFF,
                                        
One,
                                        
Zero,
                                        
0x13
                                
},

                                
Package (0x04)
                                {
                                        
0x001FFFFF,
                                        
0x02,
                                        
Zero,
                                        
0x12
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
Zero,
                                        
Zero,
                                        
0x10
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
One,
                                        
Zero,
                                        
0x15
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
0x02,
                                        
Zero,
                                        
0x12
                                
},

                                
Package (0x04)
                                {
                                        
0x001AFFFF,
                                        
0x02,
                                        
Zero,
                                        
0x12
                                
}
                        })
                        
Method (_PRT0NotSerialized)
                        {
                                If (
LNot (PICF))
                                {
                                        Return (
PICM)
                                }
                                Else
                                {
                                        Return (
APIC)
                                }
                        } 
Fijaros en estos detalles, los de HP han programado la BIOS utilizando varios "Device" dentro del PCI0 para hacer referencia a la tarjeta gráfica, utilizan el GFX0, POP2 y POP3. Es en este último donde el flag de GraphicsEnabler=Yes ha inyectado la tarjeta gráfica.
Así que será en PO3 donde la inyectaremos nosotros. 
Vamos a ver el resto de capturas de la G105M, para ir viendo como esta en el IORegistryExplorer.







TERCERO
Buceando en Insanelymac encontré alguien que inyectó la G105M, así que fijándome en la estructura y comparando con la inyección anterior, he ido buscando los parámetros en el IORegitryExplorer.
Este es el DSDT de la G105m:

Código PHP:
{
                                 
Name (_ADR0x00010000)
                                 
Device (GFX0)
                                 {
                                         
Name (_ADRZero)
                                         
Name (_SUNOne)
                                         
Method (_DSM4NotSerialized)
                                         {
                                                 
Store (Package (0x1A)
                                                         {
                                                                 
"@0,compatible",
                                                                 
Buffer (0x0B)
                                                                 {
                                                                         
"NVDA,NVMac"
                                                                 
},

                                                                 
"@0,device_type",
                                                                 
Buffer (0x08)
                                                                 {
                                                                         
"display"
                                                                 
},

                                                                 
"@0,name",
                                                                 
Buffer (0x0F)
                                                                 {
                                                                         
"NVDA,Display-A"
                                                                 
},

                                                                 
"@1,compatible",
                                                                 
Buffer (0x0B)
                                                                 {
                                                                         
"NVDA,NVMac"
                                                                 
},

                                                                 
"@1,device_type",
                                                                 
Buffer (0x08)
                                                                 {
                                                                         
"display"
                                                                 
},

                                                                 
"@1,name",
                                                                 
Buffer (0x0F)
                                                                 {
                                                                         
"NVDA,Display-B"
                                                                 
},

                                                                 
"NVCAP",
                                                                 
Buffer (0x18)
                                                                 {
                                                                         
/* 0000 */     0x040x000x000x000x000x000x010x00,
                                                                         
/* 0008 */     0xFE0x000x000x000x000x000x000x0A,
                                                                         
/* 0010 */     0x000x000x000x00
                                                                 
},

                                                                 
"NVPM",
                                                                 
Buffer (0x20)
                                                                 {
                                                                         
/* 0000 */     0x010x000x000x000x000x000x000x00,
                                                                         
/* 0008 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0010 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0018 */     0x000x000x000x00
                                                                 
},

                                                                 
"VRAM,totalsize",
                                                                 
Buffer (0x04)
                                                                 {
                                                                         
0x000x000x000x20
                                                                 
},

                                                                 
"device_type",
                                                                 
Buffer (0x0D)
                                                                 {
                                                                         
"NVDA,GeForce"
                                                                 
},

                                                                 
"model",
                                                                 
Buffer (0x1F)
                                                                 {
                                                                         
"Nvidia GeForce G105M"
                                                                 
},

                                                                 
"rom-revision",
                                                                 
Buffer (0x24)
                                                                 {
                                                                         
"DSDT ROM v.1.0 Patch By Hoang Thanh"
                                                                 
},

                                                                 
"reg",
                                                                 
Buffer (0x78)
                                                                 {
                                                                         
/* 0000 */     0x000x000x010x000x000x000x000x00,
                                                                         
/* 0008 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0010 */     0x000x000x000x000x100x000x010x02,
                                                                         
/* 0018 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0020 */     0x000x000x000x000x000x000x000x01,
                                                                         
/* 0028 */     0x140x000x010x420x000x000x000x00,
                                                                         
/* 0030 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0038 */     0x000x000x000x100x1C0x000x010x02,
                                                                         
/* 0040 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0048 */     0x000x000x000x000x000x000x000x02,
                                                                         
/* 0050 */     0x240x000x010x010x000x000x000x00,
                                                                         
/* 0058 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0060 */     0x800x000x000x000x300x000x010x02,
                                                                         
/* 0068 */     0x000x000x000x000x000x000x000x00,
                                                                         
/* 0070 */     0x000x000x000x000x000x000x020x00
                                                                 
}
                                                         }, 
Local0)
                                                 
DTGP (Arg0Arg1Arg2Arg3RefOf (Local0))
                                                 Return (
Local0)
                                         }
                                 }
                         } 
En el mismo foro también he encontrado como la gente con portátiles HP inyecta las gráficas, en concreto la GT230 y basándome en esa forma de inyectar, los datos Registry y la inyección de la G105M he construido mi inyección.

CUARTO
Pasito a paso;
1- he añadido al código genérico de inyección los datos que el código de la G105m tenía, y después los he verificado con lo que el IORegistryExplorer me daba, introduciendo los valores que este me mostraba. Y después me he guardado el código para pegarlo en mi DSDT
2- en mi dsdt, he renombrado en POP3, el PEGP a HDAU y el VGA a PEGP. Después he compilado para ver los errores que se generaban y los he ido cambiando, generalmente son instancias que llamaban al VGA.
3- El Contenido que ahora tengo en HDAU lo corto y lo pego en el nuevo PEGP, al principio justo y después comento el _ADR para que no me genere conflictos
4- En HDAU pego el contenido necesario para crear la inyección que luego especifico en el contenido concreto del PEGP, con los valores de la G105M que previamente me he preparado.
Código PHP:
                {
                    
Name (_ADROne)
                    
Method (_DSM4NotSerialized)
                    {
                        
Store (Package (0x02)
                            {
                                
"hda-gfx",
                                
Buffer (0x0A)
                                {
                                    
"onboard-1"
                                
}
                            }, 
Local0)
                        
DTGP (Arg0Arg1Arg2Arg3RefOf (Local0))
                        Return (
Local0)
                    }
                } 
5- Ahora pego después del contenido que ya tengo en el PEGP, los valores de la inyección que me havía preparado previamente y en este contenido comento el _ADR, 0x00010000 para no tener errores de compilación, compilo y compruebo.
6- Pego al final de esta inyección el "hda-gfx" que llama al contenido de de HDAU.
Código PHP:
"hda-gfx",
                                                                 
Buffer (0x0A)
                                                                 {
                                                                    
"onboard-1"
                                                                 


continuará...