Laptop’larda Harici Ekran Kartını Devre Dışı Bırakmak

Bu rehberde sizlere DSDT / SSDT düzenleyerek Switch özellikli iki ekran kartına sahip Laptop’larda ( Intel+Nvidia (Opimus) ve Intel+Radeon) ikinci ekran kartını nasıl devre dışı bırakacağınızı göstereceğiz.

Peki neden ikinci kartları devre dışı bırakmaya gerek var? Çünkü Laptop’larda Hackintosh kullanırken ikinci ekran kartları kullanamadığımız halde çalışmaya devam ederler. Buda cihazın gereksiz güç tüketmesine, bataryanın çabuk tükenmesine, ısınmasına neden olur. Her ne kadar bunu BIOS’ tan kapatabilme olanağı olsada en iyi yol düzenlenmiş ACPI kullanmaktır. Bu sayede Windows boot ettiğinizde ikinci ekran kullanmaya devam edebilirsiniz.

Bazı basit yamalar sorunu çözmemize yardımcı olabilir. Ancak bu yamalar basit olmalarına (Bazen sadace tek bir satır değiştirir) rağmen bir yada birden çok SSDT’ ye etki ettiğinden bir çok farklı hatalara yol açma ihtimalleri vardır.

Ayrıca bazı cihazlar için ACPI konfigürasyonlarında karmaşıklığa yol açan sorunları çözmek için farklı yaklaşımlar gerekir. Bu yüzden bu rehberde örnek olması açısından karmaşık yapılandırma ve olası sorunları içeren DSDT / SSDT dosyalarını kullandık.
Dolayısıyla bu rehberi takip ederken kendi DSDT/ SSDT dosyalarınızı değil, rehber sonunda paylaştığımız örnek dosyaları kullanın.

Kullandığımız örnek DSDT / SSDT dosyası Intel HD4400 + Nvidia kullanan “ Asus UX303LN”. Clover+ F4 ile çıkarttığımız ACPI dosyasını yine rehber sonunda paylaştık.

Gerekenler:
Amacımız gayet basit. Kullandığımız LapTop’larda cihazda (genellikle SSDT içinde) ikinci ekran kartını kapatmak için gerekli _OFF metodu vardır. Bunu düzeltmenin en kolay yolu _INI metod’ undan _OFF çağırmaktır.
Not: Bazı durumlarda _OFF method DSDT içinde farklı isimlendirilmiş olabilir.( GPOF, OPOF, _PS3, vs)
Bazı uygulamalarda _OFF EC (Embedded Controller) alanına eriştiklerinde _INI’ den çağrılamaz.
Bu cihazlarda yapılması gereken _REG’ den çağrılana kadar( Arg0==3 ve Arg1==1 olduğu zaman) _OFF metodunun (yada bir kısmının) geciktirilmesidir. Bazende _OFF, _REG’ den çok geç çağrılır ve bu etkili olmadığı içinde çökme ve hatalar sebep olur. Bu gibi durumlarda EC bağımlığını kaldırmak için _OFF düzenleme gereklidir. Bu sayede _OFF, _INI’den çağrılabilir.
Kodlar bu noktada _OFF metodu içinden silip ve _REG içine monte edildiğinde bu yapılan düzenlemenin etkisi aynı ancak tek farkla; Bu düzeneleme EC yapması gereken işi sonrada yapabilmesini sağlar.

TEMEL YAMALAR:

Başlamadan önce ilk olarak DSDT / SSDT dosyalarının nasıl çıkartılacağı, söküleceği ve yamalanacağını bilmeniz gerekiyor. Bunun için ilk olarak ‘ DSDT/ SSDT yama rehberimize bakın.
Laptop'lar için DSDT / SSDT Yamalamak
Rehberde DSDT / SSDT dosyaları nasıl çıkartacağınızı öğrendikten sonra iasl ile DSDT/ SSDT dosyalarını terminal kodu ile sökün.
Ayrıca temel yamaları kullanmak, NIVIDA kartları disable yapmadan önce burada alıştırma yapmak önemlilik arz etmekte. Bu yüzden ilk olarak bizim örnek dosyamızda temel yamalardan başlayacağız.
Şimdi ilk olarak terminal içine aşağıdaki kodları girerek sökme işlemi yapın.
Kod:
cd “SSDT/DSDT dosyaları nerede ise, buraya dosya yolunu girin.”
iasl -da -dl *.aml
Sökme işleminden sonra, çeşitl, dosyalara yamalama işlemine başlayabiliriz. Bizim kullandığımız örnek dosyada hemen hemen bütün dosyalarda yama işlemini yapacağız. Aşağıda kullanacağımız yamaları listeledik.
DSDT.dsl için yamalar:
"Fix PARSEOP_ZERO Error"
"Fix ADBG Error"
"Remove _DSM methods"
"IRQ Fix"
"SMBUS Fix"
"OS Check Fix (Windows 8)"
"Add IMEI"
"RTC Fix"
"Fix _WAK Arg0 v2"
"Fix _WAK IAOE" (yeni yama)
"Rename GFX0 to IGPU"
"Rename B0D3 to HDAU" (yeni yama)
"ASUS N55SL/VivoBook"
"USB3 _PRW(0x6D) and Rename XHC to XHC1" (yeni yama)
"Audio Layout 12"

SSDT-0.dsl için:
"Remove _PSS placeholders" (Yeni Yama)

SSDT-2x, SSDT-3x, SSDT-4x (Dinamik olarak yüklendiklerinden dahil değiller)
SSDT-1, SSDT-5, SSDT-6, SSDT-8 için yama gerekmez.

SSDT-7.dsl için:
"Rename GFX0 to IGPU"

SSDT-9.dsl için:
"Rename GFX0 to IGPU"
"Brightness Fix (Haswell)"
"Rename B0D3 to HDAU" (Yeni yama)

SSDT-10.dsl:
"Rename GFX0 to IGPU"

SSDT-11.dsl
"Remove _DSM methods"
"Rename GFX0 to IGPU"
"Cleanup/Fix Errors (SSDT)"

SSDT-12.dsl:
"Rename GFX0 to IGPU”

Bu yamalardan sonra Compile yaptığımızda hata almamamız gerekiyor.
Bunları iasl ile test edebilirsiniz. Terminale şu kodu girin:
Kod:
iasl *.dsl
Not: yukarıdaki komut ile compile yapmadan önce, yerleşik dsdt.aml dosyalarınızı başka bir yerde sakladığınızdan emin olun. Zira bu komut mevcut bütün aml sonuçlarını üstüne yazacaktır.

Peki yamaları kullanırken hangi dsl dosyasına yama yapmamız gerektiğini nasıl bulacağız. Bunun için Terminalde grep komutlarını kullanacağız. Bu sayede mesele GFX0’ ın hangi dsl dosyalarında olduğunu tespit edebiliriz.
Bununla ilgili yararlı olacak bazılarını aşağıda paylaştım:
  • B0D3 (İsmi farklı olsa bile) 'grep -B3 _ADR.*0x00030000 *.dsl komutu ile bulunabilir.
  • GFX0 (İsmi farklı olsa bile) 'grep -B3 _ADR.*0x00020000 *.dsl komutu ile bulunabilir.
  • "Rename GFX0 to IGPU” GFX0 referansları ile herhangi bir dosyaya uygulabilir. Bu gibi dosyaları 'grep -l GFX0 *.dsl’ komutu ile bulabilirsiniz.
  • Aynı şekilde "Rename B0D3 to HDAU”, ’grep -l B0D3 *.dsl’ komutu ile bulunabilir.
  • "Remove _DSM methods" meted, _DSM methods ile başlangıçta herhangi bir dosyaya uygulanabilir. Bunuda 'grep -l Method.*_DSM *.dsl’ komutu ile bulabilirsiniz.
Harici Ekran Kartını devre dışı bırakmak için yamalamak
Hedefimiz neydi tekrar hatırlayalım: _OFF içinden Call_INI çağırmak. Bu noktada yukarıda yaptığımız düzenlemeklerden sonra, elimizde compile yaptığımızda hatasız, dengeli yeniden isimlendirmeler ve tekrar etmeyen _DSM metotları olmayan DSDT/ SSDT var.
Peki şimdi içnde _OFF barındıran SSDT’leri nasıl bulacağız. Bunun için grep kullanacağız
Kod:
grep -l Method.*_OFF *.dsl
Bu komut bize şunları gösterecek:
Kod:
SSDT-10.dsl
SSDT-11.dsl
Ayrıca _INI metotunun nerede olduğunuda öğrenelim:
Kod:
grep -l Method.*_INI *.dsl
Buda size şu sonuçları verecek:
Kod:
DSDT.dsl
SSDT-10.dsl
SSDT-11.dsl
SSDT-9.dsl
Not: SSDT-10 ve SSDT-11 tekrar listelendiğini görüyoruz. Bunu _OFF ve _INI’ nin hangi konumlarda ilişkili olduğunu gösteriyor.
SSDT-10.dsl açtığınızda "Method (_INI” ararsanız şunu bulursunuz:
Kod:
 Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            Store (Zero, \_SB.PCI0.RP05.PEGP._ADR)
        }

Bu harici grafik kartları için tipik bir _INI metodu. Şimdi biz bunu _CALL olarak çağırmak için yamalayacağız.
Eğer bu metoda tıklarsanız (sol kolonda) ACPI yolunun metot içinde çalıştığını görebilirisiniz. SSDT -> \_SB.PCI0.RP05.PEGP -> _INI. Şimdi biz _off’ un bulunduğu yolu ve bunun \_SB.PCI0.RP05.PEGP._OFF olması gerektiğini biliyoruz.
Şimdi _OFF’ un hem SSDT-10 hemde SSDT-11 içinde olduğunu biliyoruz. Eğer SSDT-10 açıp _OFF bakarsanız bunun bir PowerResource macro metodu olduğunu görürsünüz. Bu bizim istediğimiz _OFF metodu değil. Şimdi SSDT-11 açın ve yine _OFF bakın. Burada düzenli bir _OFF metodu göreceksiniz ki bizim aradığımızda tam olarak bu. Artık bize gereken _OFF nerede biliyoruz.
Şu an bize gereken potansiyel EC girişleri için gerekli kodları gözden geçirmek.
SSDT-11 içinde tanımlı _OFF şu şekilde:
Kod:
  Method (_OFF, 0, Serialized)  // _OFF: Power Off
        {
            If (LEqual (CTXT, Zero))
            {
                \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
                If (LNotEqual (GPRF, One))
                {
                    Store (VGAR, VGAB)
                }

                Store (One, CTXT)
            }

            SGOF ()
        }
Eğer kodu incelerseniz girişlerin EC erişimini görebilirsiniz: (\_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero). Bu şu an _OFF’ un _INI’ den çağırıldığında yürütülmesini engelleyecektir. EC erişimi sorunu çözmenin en iyi yolu _OFF içinden kusurlu kodu silmek .
Bunun için şu yamayı kullanalım:
Kod:
into method label _OFF parent_label \_SB.PCI0.RP05.PEGP code_regex .*EC.* removeall_matched;
Modifiye edilmiş _OFF metodu şu şekilde görünecek:
Kod:
 Method (_OFF, 0, Serialized)  // _OFF: Power Off
        {
            If (LEqual (CTXT, Zero))
            {
                If (LNotEqual (GPRF, One))
                {
                    Store (VGAR, VGAB)
                }

                Store (One, CTXT)
            }

            SGOF ()
        }

Ancak işimiz daha bitmedi. _REG içinden de \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero) satırını kaldırmamız gerekiyor. Bunu aklınızda tutun.

Yukarıda ki işlemlerden sonra SSDT-11 içinde _OFF düzeltmesini yaptık. Şimdi bunu SSDT-10 içinde tanımlanan _INI’ den çağıralım.

Bunun için "Disable from _INI (SSDT)” yamasını uygulayabiliriz. Ancak bizim metodun yolu yaygın olan yoldan biraz farklı. Bu yüzden yamamızda bir kaç değişiklik yapacağız. Ayrıca SSDT-11 içinde tanımlanmış _OFF çağıracağız, bu nedenle harici bildirime ihtiyacımız var.
Modifiye yamamız şu şekilde:
Kod:
into method label _INI parent_label \_SB.PCI0.RP05.PEGP insert
begin
//added to turn nvidia/radeon off\n
External(\_SB.PCI0.RP05.PEGP._OFF, MethodObj)\n
_OFF()\n
end;
Yamayı uyguladıktan sonra, yamalanmış _INI şimdi okunabiliyor.
Kod:
 Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
            Store (Zero, \_SB.PCI0.RP05.PEGP._ADR)
            //added to turn nvidia/radeon off
            External(\_SB.PCI0.RP05.PEGP._OFF, MethodObj)
            _OFF()
        }
Şimdi dikkatimizi DSDT _REG’ e verelim. _REG metot, _OFF’ un yamalMsan önce EC’ win işini yapması gerekiyor.
DSDT içindeki Orijinal _REG ( EC0 için) aşağıdaki gibi görüniyor:
Kod:
 Method (_REG, 2, NotSerialized)  // _REG: Region Availability
            {
                If (LEqual (Arg0, 0x03))
                {
                    Store (Arg1, ECFL)
                }
            }
Şimdi _OFF from _REG uygulayalım: Burada _OFF çağırmak yerine SPIN kullanıyoruz.
Kod:
into method label _REG parent_hid PNP0C09 insert
begin
//added to turn nvidia/radeon off\n
If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))\n
{\n
    \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)\n
}\n
end;
Yamadan sonra _REG şu şekilde görünecek.
Method (_REG, 2, NotSerialized) // _REG: Region Availability
Kod:
 {
                If (LEqual (Arg0, 0x03))
                {
                    Store (Arg1, ECFL)
                }
                //added to turn nvidia/radeon off
                If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))
                {
                    \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
                }
            }

Bu işlemden sonra yama işleminin sonuna geliyoruz. Bu noktadan sonra yapmamız gereken compile yaptıktan sonra DSDT dosyalarımızı kullanmak.

Bizim burada kullandığımız alıştırmalar karmaşık olabilir. Ancak bu demek değil ki bütün Laptop’ larda düzenlemeler aynı şekilde olacaktır. Mesela; Çoğunlukla harici aygıtlar için ilişkili _INI ve _OFF aynı SSDT içindedirler. Bu gibi durumda External declaration gerek yok. SSDT içinde direk olarak "Call _OFF from _INI” kullanabilirsiniz. Hatta bazıları direk olarak DSDT içinde mevcut olabilir. Bu nokta da yine yamayı direk olarak kullanabilirsiniz. Ayrıca bütün _OFF metotları EC’ ye erişmez. Bu gibi durumlarda EC ile ilişkili kodları _REG’ e taşımaya gerek yok.

Ve son olarak EC ile ilişkili kodlar birden çok satırda olabilir. Bu gibi durumlarda tüm bu kodların _REG’ e taşınması gerekiyor.

Ve son olarak ; Tüm bu düzenlediğiniz dosyaların CLover bootloader içinde doğru konuma koyduğunuzdan emin olun. Ayrıca Config dosyanızda drop OEM SSDT yamasının etkin olması gerekiyor. (Clover: DropOem=true)

Uyku/ Uykudan Uyanma Problemi
Bazı Laptop’ larda bu yamalardan sonra uyku/ Uyanma prblemleri görülebilir. Bu durumda MaciASL içinden "Disable/Enable on _WAK/_PTS (DSDT)” yamasını kullanmak gerekiyor.
Ancak DSDT içindeki _OFF/_ON farklı yollarda olduklarından bunu modifiyi etmemiz gerekiyor.
MaciASL içindeki original yama şu şekilde:

Kod:
into method label _PTS code_regex ([\s\S]*) replace_matched
begin
External(\\_SB.PCI0.PEG0.PEGP._ON, MethodObj)\n
If (CondRefOf(\\_SB.PCI0.PEG0.PEGP._ON)) { \\_SB.PCI0.PEG0.PEGP._ON() }\n
%1
end;

into method label _WAK code_regex (Return\s+\(.*) replace_matched
begin
External(\\_SB.PCI0.PEG0.PEGP._OFF, MethodObj)\n
If (CondRefOf(\\_SB.PCI0.PEG0.PEGP._OFF)) { \\_SB.PCI0.PEG0.PEGP._OFF() }\n
%1
end;
Modifiye edilmiş yama şu şekilde (PEG0 RP05 olarak değiştirildi)
Kod:
into method label _PTS code_regex ([\s\S]*) replace_matched
begin
External(\\_SB.PCI0.RP05.PEGP._ON, MethodObj)\n
If (CondRefOf(\\_SB.PCI0.RP05.PEGP._ON)) { \\_SB.PCI0.RP05.PEGP._ON() }\n
%1
end;

into method label _WAK code_regex (Return\s+\(.*) replace_matched
begin
External(\\_SB.PCI0.RP05.PEGP._OFF, MethodObj)\n
If (CondRefOf(\\_SB.PCI0.RP05.PEGP._OFF)) { \\_SB.PCI0.RP05.PEGP._OFF() }\n
%1
end;
Eğer sizde uyku problemi vs yoksa yukarıda ki yamayı uygulamıza gerek yok.

Eski Laptop’lar:

Eski Laptop’ larda _OFF olmayabilir yada boş olabilir. Bu gibi durumlarda _PS3 yaması gereklidir. Ancak bazı durumlarda _PS3, ilişkili _DSM ile uygun parametreler ile çağrılmadığında _PS3 çalışmayabilir.
Bu gibi durumlarda _INI metodu içinde _DSM metodu ardından _PS3 metodu çağrılır. Bu sayede NIVIDIA devre dışı bırakılır.
Kod:
 \_SB.PCI0.P0P2.VGA._DSM () (Buffer (0x10) // You may need to change path to VGA.DSM for your config
  {
     /* 0000 */    0xF8, 0xD8, 0x86, 0xA4, 0xDA, 0x0B, 0x1B, 0x47,
     /* 0008 */    0xA7, 0x2B, 0x60, 0x42, 0xA6, 0xB5, 0xBE, 0xE0
  }, 0x0100, 0x1A, Buffer (0x04)
  {
     0x01, 0x00, 0x00, 0x03
  })
  If (One)
  {
     \_SB.PCI0.P0P2.VGA._PS3 () // You may need to change path to VGA.PS3 for your config
  }

Çalışma için DSDT/ SSDT DOSYASI:
ASUS_UX303LN_origin.zip
 
Son düzenleme:
Güzel bir çalışma olmuş. Deneyimlerinizi bizimle paylaştığınız için teşekkür ederim.
Peki Bootloader ile yapılan engelleme sizin *.aml dosyaları ile yaptığınız etkiyi gösteriyor mu, yada her iki yöntem birbirinden farklı mı ?
Meselâ Clover için nVidia Ekran Kartını devre dışı bırakmak için nv_disable=1 gibi.
Saygılar.
 
Hocam aşırı gerizekalı olduğumu buna bakarak anladım açıkcası :)

Makaleniz için elinize sağlık yalnız hiçbir şey anlamadım. Dönüp dönüp buna benzer makalelerinizi de okuyorum işin içinden çıkamıyorum.

GTX850 kartı kapatacağım ancak makaleden bir şey anlamadığım için devam edemiyorum açıkcası.
 
Rehber için elinize sağlık. Harika olmuş. Bişey kafamı karışıtırdı sadece onu sormak istiyorum. Sizin verdiğiniz örnek DSDT dosyasında SSDT'ler 12 ye kadar gidiyor. Benim laptop Asus x550jk, ben DSDT'leri çıkarttığmda bende SSDT 9 a kadar gidiyor. Sizin ornek DSDT'yimi kullanayım, yoksa kendi DSDT'mi mi?
 
Cevap için teşekkür ederim. Sanırım sorumu yanlış bir şekilde sordum ama cevabı anladım :) Sizin verdiğiniz DSDT dosyası üzerinde düzenleme yapıcam anladığım kadarıyla.
 
Hayır, kendi dosyan ile yapacaksın. Bizim rehberde paylaştığımız DSDT Dosyaları kendi DSDT dosyanı düzenlemeden önce, rehberde anlatılan yönergeleri test edip deneyim kazanmanız için.
 
selamlar

"_OFF" ssdt 9 içinde fakat "_INI" dsdt, ssdt 7 ve ssdt 8 içinde gözüküyor .
_OFF ve _INI'nin ilişkili olduğu bir ssdt yok. Bu durumda ne yapmam gerekir?
 

Dosya Ekleri

  • Ekran Resmi 2017-02-28 14.52.33.png
    Ekran Resmi 2017-02-28 14.52.33.png
    3,6 KB · Görüntüleme: 302
Uyarı! Bu konu 8 yıl önce açıldı.
Muhtemelen daha fazla tartışma gerekli değildir ki bu durumda yeni bir konu başlatmayı öneririz. Eğer yine de cevabınızın gerekli olduğunu düşünüyorsanız buna rağmen cevap verebilirsiniz.

Yeni konular

Geri
Yukarı