1. hizliresim.com üzerinden resim paylaşımlarınızda resim silinir ve uyarı alırsınız. Bu yüzden farklı kaynaklara resim yükleyin.
    Uyarıyı kapat
Uyarıyı kapat
PROFİL MESAJINDAN YARDIM TALEPLERİ, BUNDAN BÖYLE İSTİSNASIZ SİLİNECEKTİR!!

Laptop Cihazlarda Harici Ekran Kartını Kapatmak

'OS X INFO KÜTÜPHANESİ' forumunda tosbaha tarafından 13 Haziran 2017 tarihinde açılan konu

Bu Sayfayı Paylaş

  1. Çoğu laptopta Intel kartına ek olarak Nvidia veya AMD ekran kartı vardır. Bu kartlar macOS ile kullanılamamaktadır. Bu kartlar sistemden kapatılmadığı zaman daha fazla güç kullanımına ve hızlı fan çalışmasına ve dolayısıyla düşük pil ömrüne sebep olmaktadır. Aşağıdaki rehberde bu kartların nasıl kapanacağını anlatmaya çalışacağım. Rehber uzun olabilir ama adım adım takip ederseniz ve her adımı neden yaptığımızı anlarsanız, problem yaşamazsınız. Rehberi daha da anlaşılır kılabilmek için örnek bir makinenin dosyalarını da buraya ekledim. Siz de kendinizi deneyebilirsiniz.

    [WARNING]Aşağıdaki yamalar sadece ve sadece ekran kartını kapatmak içindir. Batarya ses kartı vs için uyguladığınız yamalar varsa tekrar uygulayın.[/WARNING]

    İçerik
    1. Öncelikle orjinal DSDT ve SSDT dosyalarınıza ihtiyacımız var. Bunun için buradaki rehberi takip ederek bir klasöre dosyalarınızı çıkartın. Sökerken BÖLÜM 4: ACPI Dosyalarının "refs.txt" İle Sökülmesi kısmını takip edin.
    2. MaciASL indirin
    3. MaciASL/Preferences/Sources kısmına eğer ekli değilse şunu ekleyin.
    4. Clover ile çıkardığınız dosyalar içersinde sonu x ile biten dosyalar varsa bu dosyaları silin.
    5. Yama yapılacak dosyaların bulunması
    6. Rename GFX0 to IGPU yaması
    7. Ekran Kartının Kapanması
    8. Gerekli diğer yamaların yapılması.

    Şimdi örnek dosyalar üzerinden 4. adımdan başlayalım. Klasörü açtığımız zaman sonu x ile biten şu dosyları görüyoruz ve onları siliyoruz.

    4. Dosyaların Silinmesi
    • SSDT-3x.dsl
    • SSDT-4x.dsl
    • SSDT-5x.dsl

    5. Yama yapılacak dosyaların bulunması

    Önce GFX0 geçen bütün dosyaları buluyoruz. Dosyaların olduğu klasöre gidiyoruz ve terminale şunu yazıyoruz.
    Kod:
    grep -l GFX0 *.dsl
    Sonuç şu olacaktır.
    Kod:
    DSDT.dsl
    SSDT-0.dsl
    SSDT-1.dsl
    SSDT-10.dsl
    SSDT-11.dsl
    SSDT-12.dsl
    SSDT-2.dsl
    SSDT-6.dsl
    SSDT-7.dsl
    SSDT-8.dsl
    SSDT-9.dsl
    
    Bütün bu dosyalara yama yapılacaktır. İlk yapacağınız yama her zaman Rename _DSM methods to XDSM olsun. Cihazların ayarlarını barındıran bu methodların silinmesi veya isminin değişmesi gerekir.Bazı dosyalarda bu yamaya gerek olmayabilir.


    6. Rename GFX0 to IGPU yaması

    DSDT.dsl

    • Rename _DSM methods to XDSM
    • OS Check Fix (Windows 8) Buradaki amaç macOS u Windows gibi tanıtmak. Çünkü bazı cihazlar mesela sadece uygun Windows versiyonu varsa açılır. Sizin cihazınızda en yüksek Windows ne ise ona uygun yamalayabilirsiniz.
    • Rename GFX0 to IGPU
      Ekran kartı için bütün yamalarda ilk bunun uygulanması gerekir.
    • Batarya vs için diğer yamaları uygulamayı unutmayın.
    SSDT-0.dsl
    • Rename _DSM methods to XDSM
    • Rename GFX0 to IGPU
    SSDT-1.dsl
    • Rename GFX0 to IGPU
      Bunu yapıp compile dediğimizde şu hatayı alıyoruz.
      • 246, 6126, syntax error, unexpected PARSEOP_PACKAGE
    • Bu hatayı görünce yapacağımız yama şu:
      • [syn] Remove _PSS placeholders
    SSDT-2.dsl
    • Rename GFX0 to IGPU
    SSDT-6.dsl
    • Rename GFX0 to IGPU
    SSDT-7.dsl
    • Rename GFX0 to IGPU
    SSDT-8.dsl
    • Rename GFX0 to IGPU
    Gördüğünüz gibi bu dosyada birden fazla isim değiştirme var. Muhtemelen bu dosyada diğer ekran kartı var aklımızda tutalım.

    SSDT-9.dsl
    • Rename GFX0 to IGPU
    SSDT-10.dsl
    • Rename B0D3 to HDAU
      Grafik kartı ve ses ile alakalı yama. layout id 12 kullanır. Eğer ses layout için başka numara kullanıyorsanız bunu değiştirebilirsiniz.
    • Rename GFX0 to IGPU
      Gördüğünüz gibi bu dosyada birden fazla isim değiştirme var. Muhtemelen bu dosyada diğer ekran kartı var aklımızda tutalım.
    SSDT-11.dsl
    • Rename GFX0 to IGPU
      Gördüğünüz gibi bu dosyada birden fazla isim değiştirme var. Muhtemelen bu dosyada diğer ekran kartı var aklımızda tutalım.
    SSDT-12.dsl
    • Rename GFX0 to IGPU
      Gördüğünüz gibi bu dosyada birden fazla isim değiştirme var. Muhtemelen bu dosyada diğer ekran kartı var aklımızda tutalım.
    • Bu dosyayı compile etmeye çalışınca 1324, 6126, syntax error, unexpected PARSEOP_NAMESEG hatası alıyoruz. Bu hatayı alınca uygulayacağınız yama:
      [gfx0] Cleanup/Fix Errors (SSDT)
    7. Ekran Kartının Kapatılması

    Şimdi yamanın ilk ayağı olan Rename GFX0 to IGPU kısmını bitirdik. Şimdi yapacağımız harici kart olan SSDT yi bulup o kartın _INI (başlangıç) kısmında _OFF metodunu çağıracağız.

    DSDT / SSDT Dosyalarımız içinde _OFF geçen dosyaları bulalım. Yine komut satırına gidiyoruz ve şunu yazıyoruz.
    Kod:
    grep -l Method.*_OFF *.dsl
    Sonuç şu olacaktır:
    • SSDT-12.dsl
    Demek ki ekran kapatma kısmımız bu dosyada. Şimdide ekran kartını başlatan dosyaları bulalım:
    Kod:
     grep -l Method.*_INI *.dsl 
    • DSDT.dsl
    • SSDT-10.dsl
    • SSDT-11.dsl
    • SSDT-12.dsl
    Harici ekran kartlarının ismi genelde PEGP olur. Şimdi SSDT dosyalarına tek tek bakalım ve ekran kartının _INI kısmını bulalım.
    • SSDT-10.dsl içinde _INI arıyoruz:
      Burada ekran kartı yok.
    • SSDT-11.dsl
      Kod:
        Method (_INI, 0, NotSerialized)  // _INI: Initialize
        {
        Store (Zero, \_SB.PCI0.RP05.PEGP._ADR)
        }
      
    _INI (başlangıç) kısmında _OFF metodunu çağıracağız. Eğer _INI ve _OFF kısmı aynı dosyada ise _INI den _OFF methodu çağrılır fakat eğer farklı dosyalarda ise işler biraz daha karışıktır.
    Gördüğünüz gibi _INI methodumuz bu fakat _OFF methodumuz başka dosyada. Böyle olduğu zaman bazı şeylere dikkat etmemiz gerekiyor.
    Bazen _OFF kısmında EC (Embedded Controller) ye erişim sağlanır. Biz _INI' den _OFF' u çağırdığımız zaman bu EC aktif olmayabilir ve bu yüzden problemler çıkar. Bu yüzden SSDT-12.dsl dosyasındaki _OFF kısmını inceleyelim:
    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 ()
      }
    
    Gördüğünüz üzere \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero) ile EC ye erişim sağlanıyor. Bunu halletmemiz gerekiyor. Biz bunu bu dosyadan silip başka dosyaya ekleyeceğiz. O satırı siliyoruz ve şu hale getiriyoruz ve compile diyoruz
    Kod:
      Method (_OFF, 0, Serialized)  // _OFF: Power Off
      {
      If (LEqual (CTXT, Zero))
      {
      If (LNotEqual (GPRF, One))
      {
      Store (VGAR, VGAB)
      }
    
      Store (One, CTXT)
      }
    
      SGOF ()
      }
    
    Bazen nadir olsa da, EC yi çağırmak için bir methodu da çağırabilir. O methodu inceleyip EC den bir şeyin çağrılmadığına emin olun.

    SSDT-11.dsl dosyasının _INI kısmını söyle yapıyoruz:
    Kod:
      Method (_INI, 0, NotSerialized)  // _INI: Initialize
      {
      Store (Zero, \_SB.PCI0.RP05.PEGP._ADR)
      External(\_SB.PCI0.RP05.PEGP._OFF, MethodObj) // ekran kartinin adresi
      _OFF()
      }
    
    Gördüğünüz gibi _OFF metodo SSDT-12.dsl de olduğundan External.. diyerek o methodu belirtiyoruz. ve _OFF() ile kapatıyoruz. Buraya dikkat edin. SSDT-12.dsl dosyasındaki grafik kartının adres yolu neyse onu yazmanız gerek. Farklı cihazlarda bu adres farklı olabilir. Mesela SB.PCI0.PEG0.PEGP gibi.

    İşimiz hala bitmedi. Sildiğimiz \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero) satırını eklememiz gerekiyor. DSDT dosyası ile EC başlatılıyor. Biz de bu satırı DSDT dosyasına ekleyeceğiz.
    DSDT.dsl dosyasını açıyoruz.
    EC0 nın reg methodu şöyle bir şekilde:
    Kod:
      Method (_REG, 2, NotSerialized)  // _REG: Region Availability
      {
      If (LEqual (Arg0, 0x03))
      {
      Store (Arg1, ECFL)
      }
      }
    
    Bunu şu şekide değiştiriyoruz:
    Kod:
    
      Method (_REG, 2, NotSerialized)  // _REG: Region Availability
      {
      If (LEqual (Arg0, 0x03))
      {
      Store (Arg1, ECFL)
      }
      // EC0 kodunu ekliyoruz.
      If (LAnd(LEqual(Arg0,3),LEqual(Arg1,1)))
      {
      \_SB.PCI0.LPCB.EC0.SPIN (0x96, Zero)
      }
      }
    
    Bu yamalar ile diğer ekran kartı kapanacaktır. Fakat bazı durumlarda bu yamalar yüzünden uykuya geçme problemi olabilir.
    Bu nedenle aşağıdaki yamaları da yapıyoruz. Aşağıdaki yamalar ile uykuya geçmeden önce ekran kartı açılıyor ve uyandıktan sonra tekrar kapatılıyor. Bu yamaları MaciASL nin patch yazan text kutusuna yazıp patch diyorsunuz.


    DSDT.dsl
    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;
    
    Burada önemli olan nokta _SB.PCI0.RP05.PEGP kısmı her ekran kartında farklı olabilir. Bazılarında mesela SB.PCI0.PEG0.PEGP Bu rehberi okuyanlar ona dikkat etsinler.


    Gördüğünüz gibi rehber uzun olduğu için herkese birebir yardım etmem olanaksız. Umarım bana anlayış göstrebilirsiniz.
     

    Ekli dosyalar:

    #1 tosbaha, 13 Haziran 2017
    Moderatör tarafından düzenlendi: 22 Haziran 2018
  2. mantıklı bir hareket.
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Hepsini görmek için tıklayın...
  3. Hocam bende 11 tane çıkıyor ve sizin belirttiğiniz hatalar farklı dosyalar da çıkıyor yanlış mı ilerliyorum yoksa her pc de farklı mı. Birde diğer konuda ddsdt çıkartırken laptop seçim yerinde benim laptop yok hiç bir şey seçmesek ne olur.
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Hepsini görmek için tıklayın...
  4. Her cihaz farklı donanıma sahip. Dolayısıyla DSDT ve SSDT dosyaları farklıdır. Başkasının yamalanmış DSDT ve SSDT dosyaları siz de çalışmaz. Burada örnek vermemin amacı size harici grafik kartını nasıl kapatılacağını örnek ile anlatmak. DSDT ve SSDT dosyaları Clover ekranında iken F4 tuşuna basarak çıkartılır. Buradaki rehberi takip edin. DSDT ve SSDT yaması yapmadan laptopunuz çalışıyorsa yapmanıza gerek yok ama stabil bir sistem, güç yönetimi için bu yamaları yapmayı öğrenmeniz sizin yararınızadır.
     
  5. O zaman Sierra kategorisi altında konunu aç. DSDT kategorisi sadece DSDT dosya paylaşımları içindir.
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Hepsini görmek için tıklayın...
  6. Merhabalar,
    Öncelikle rehber için teşekkürler.
    Rehberde de belirttiğiniz gibi, _INI ve _OFF un ayrı SSDT lerde olduğu durumlar ve EC ye erişim sağlayan durumlar için çözüm verilmiş.
    Benim durumumda ise _INI ve _OFF ikiside SSDT-8 içerisinde aşağıda görüldüğü gibi:

    Kod:
    Method (_INI, 0, NotSerialized)  // _INI: Initialize
            {
                Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
            }
    Kod:
    Method (_OFF, 0, Serialized)  // _OFF: Power Off
                {
                    \_SB.PCI0.PEG0.PEGP.SGOF ()
                    Store (Zero, _STA)
                }
    Sormak istediklerim:
    _OFF dan ekran kartını silince aşağıdaki gibi mi olacak, çünkü sizinki baya bi kalabalık benimki çok yalın kaldı :)

    Kod:
    Method (_OFF, 0, Serialized)  // _OFF: Power Off
                {
                   Store (Zero, _STA)
                }
    Sizin örnekte farklı SSDT lerde olduğundan _INI metoduna OFF u External olarak eklediniz. Benimki aynı SSDT de olduğundan Internal mu yazmam gerekiyor yoksa takısız aşağıdaki gibi mi olmalı?

    Kod:
    Method (_INI, 0, NotSerialized)  // _INI: Initialize
            {
                Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
                (\_SB.PCI0.RP05.PEGP._OFF, MethodObj) // ekran kartinin adresi
                _OFF()
            }
    Son sorum ise benim örneğimde anladığım kadarı ile EC ye bir erişim yok bu durumda DSDT ye bir ekleme yapacak mıyız?

    İlgili SSDT-8.dsl : SSDT-8.dsl - Google Drive
    İlgili DSDT.dsl: dsdt.dsl - Google Drive
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Hepsini görmek için tıklayın...
  7. Eğer _INI ve _OFF aynı .dsl dosyasında ise _INI den _OFF çağrılır ve iş biter. Sizin dosyanıza baktım aşağıdaki gibi yapınca hata veriyor.
    Kod:
      Method (_INI, 0, NotSerialized)  // _INI: Initialize
      {
      Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
      _OFF()
      }
    
    Bu da demek oluyor ki _OFF ile _INI aynı scope ait değil. Diğer .dsl dosyalarınızı iyi kontrol ettiğinizden emin olun. Eğer kesinlikle eminseniz şu yamadan sadece birini deneyin

    Yama1
    Mantık: External ile OFF methodunun yolunu gösteriyoruz.
    Kod:
     Method (_INI, 0, NotSerialized) // _INI: Initialize
    {
      Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
      External(\_SB.PCI0.PEG0.PEGP._OFF,MethodObj)
      _OFF()
    }
    
    Yama2
    Mantık: _OFF methodu SGOF u çağırdığı için biz de direk onu çağırıyoruz. SGOF _INI ile aynı scope ta olduğu için sorun olmuyor.
    Kod:
     Method (_INI, 0, NotSerialized) // _INI: Initialize
    {
      Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
      SGOF()
    }
    
     
  8. Terminalden _OFF arattırdığımda 8 ve 9 _INI arattırdığımda 7-8-9 ve DSDT sonucu çıkıyor. Çok emin olamadığmdan tüm Patched klasörünü ekledim: patched - Google Drive
    Son cevabınızdakileri uygulamaya çalışırken _OFF metodundaki kısmı silip silmemekten bahsetmemişsiniz. EC ye erişim sağlanmadığından _OFF metoddaki '' \_SB.PCI0.PEG0.PEGP.SGOF () '' kısmını silmicem sanırım. Sadece _INI kısmına iki yamadan birini uygulayıp yeniden başlattığımda sonucu görmemiz gerekli, anladığım kadarıyla.
    Peki bu kartın devre dışı kaldığını nasıl anlıcaz?
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Hepsini görmek için tıklayın...
  9. Sizin OFF methodunuz EC ye erişmiyor o yüzden eklenip silinecek bir şey yok. \_SB.PCI0.PEG0.PEGP._OFF methodu başka bir .dsl dosyasında ise ona bakın. Eğer EC vs görürseniz rehberde anlatıldığı gibi düzeltmeniz gerek.

    Yama çalışırsa eğer About This Mac-->System Report-->Graphics/Displays kısmında sadece bir ekran kartı görürsünüz. Dediğim iki yamadan birini deneyerek kontrol edin.
     
  10. Malesef hiç biri olmadı. Hatta hata veriyor dediğiniz

    Kod:
    Method (_INI, 0, NotSerialized)  // _INI: Initialize
      {
      Store (Zero, \_SB.PCI0.PEG0.PEGP._ADR)
      _OFF()
      }
    bu kodu bile

    Kod:
    External (_SB_.PCI0.PEG0.PEGP._OFF, MethodObj)    // 0 Arguments (from opcode)
    kodunu en üstteki externalların arasına ekleyerek düzeltim denedim yine kapanmadı.
     
    Stop hovering to collapse... Click to collapse... Hover to expand... Hepsini görmek için tıklayın...
Yükleniyor...
Yükleniyor...