DuongTH

https://duongth.com
Staff member
23/5/15
2,260
780
113
TP. Hồ Chí Minh
duongth.com
Lưu ý: Đây là trang chính thức của guide. Nếu bạn muốn sao chép và đăng ở nơi khác cần phải hỏi ý kiến tác giả và ghi nguồn đầy đủ.

Bài viết này dựa trên kinh nghiệm patch trên những con GPU của laptop mình đã và đang xử lí, với desktop có thể mang tính tham khảo.

351px-Nvidia_logo.svg.png

1. Phần cứng áp dụng guide này:

  • Laptop chỉ có 1 GPU Nvidia ( K43SJ, K43SV, VPCEH25EG, Satellite L745 v.v.v... hoặc một số máy HP/Dell/Thinkpad dòng workstation mobile dùng card quadro ).
  • Laptop có 1 GPU Nvidia + 1 iGPU intelHD nhưng có thể disable iGPU intelHD trong bios.
  • Guide hoạt động chính xác trên card Geforce , card Quadro mời các bạn thử nghiệm.
  • Desktop có sử dụng Card nVidia.
  • Các thể loại lap có optimus intelHD + nVidia không disable intelHD từ bios được thì không cần đọc guide này
Do nguồn tư liệu( DSDT, SSDT, IOReg, Graphics ROM) nên trong guide sẽ viết phần nhiều dựa trên kinh nghiệm của mình + tham khảo các topic report tại tonymac và insanelymac + tham khảo hướng dẫn tại rampagedev và osx86vn.com + report test trực tiếp trên máy mem cũng như chính con K43SJ của mình.

2. Lý do phát sinh guide:


    • Hầu hết card nVidia đều native với LVDS hoặc chỉnh một vài thiết lập trong bootloader là được. Tuy nhiên, với laptop thì 2 cổng xuất tín hiệu hình ảnh quan trọng là VGA/HDMI thì không hề native. Hiển nhiên rằng cổng VGA sẽ không hoạt động vì không có con máy Mac nào có cổng VGA cả - fix bằng cách thiết lập NVCAP. Cổng HDMI có thể may mắn hoạt động hoàn hảo hoặc lỗi không có âm thanh, lỗi khi cắm thì LVDS tự đen màn hình ( tự tắt )v.v... xui nhất là HDMI không hoạt động.
    • Không như card AMD , khi các bạn patch Framebuffer chuẩn thì tất cả các thành phần bao gồm LVDS,VGA,HDMI, DisplayPort... đều có thể xuất đầy đủ tín hiệu cùng lúc. Với nVidia có thể chỉ nhận được 1 LVDS + 1 VGA hoặc 1LVDS +1HDMI mà thôi. Một số trường hợp dùng dock thì có thể may mắn xuất thêm một màn hình nữa thông qua cổng ở dock ( những máy dòng workstation ).
    • nVidia có webdriver chủ yếu dành cho Quadro và một số card có kiến trúc mới mà Apple chưa kịp cập nhật vào Mac khi phát hành. Nhưng webdriver thì dành cho Mac thật và phần cứng của Mac thật, hiển nhiên nó không giải quyết được 2 vấn đề bên trên vẫn phải patch.
3. Cấu trúc Guide:
*Do tính chất nâng cao nên yêu cầu tối thiều là người đọc đã biết sử dụng clover configurator, hiểu biết cơ bản về Clover (ít ra là không bị nhiễu loạn kiến thức của Chameleon).
+ Chuẩn bị nguyên liệu.
+ Patch DSDT
+ Thiết lập config
+ Cài webdriver
+ Fix [AGPM Controller] unknownPlatform

Kết hợp các phương pháp hợp lý là xong.
*trường hợp mà chưa biết thế nào là hợp lý thì random đến khi nào QE/CI thì ngừng.

4. Chuẩn bị nguyên liệu:
+ Đã cài được Mac theo guide AIO với bootloader Clover ( bao gồm cả Clover Legacy và Clover EFI ) . Theo kinh nghiệm cá nhân thì Clover inject card nVidia khá tốt.
+ Bộ tool này và giải nén ra.


Trích xuất DSDT và các bảng APCI: Dùng Clover trong bộ tool ấn F2 F4 F6 trong giao điện boot của clover/
- toàn bộ các bảng ACPI : DSDT, SSDT, v.v.... sẽ trong thư mục ACPI\origin.
- file rom và prelog sẽ nằm trong mics , tên mặc định là c0000.bin , bạn rename thành c0000.rom.

- Xác định NVCAP.
File rom đã được chuẩn bị ở trên bằng cách dùng clover, tuy nhiên bạn cũng có thể dùng Darwin dumper để lấy file rom.
Dùng NVCAP maker , mở đến file rom để tự động tính toán
Screen%20Shot%202015-03-29%20at%209.22.41%20PM_zps8plqik1a.png
* với các bạn dùng Clover legacy, định dạng lại USB về MBR, format FAT32, copy foler efi vào và tiến hành các bước trên mới có nguyên liệu.

5. Khuyến khích các bạn nghiên cứu guide chia sẻ và thảo luận với:

  • DSDT, SSDT và ROM GPU
  • Aida64 report Hardware htm ( nhớ kiếm key để điền vào AIDA64 trước khi tạo report )
  • IOReg hoặc IOJones sạch khi mới cài máy (k có dsdt) trích bằng IORegistryExplorer hoặc IOJones ( đều đã có trong HVT ).

Tất cả 3 zip lại <tên máy>.zip, up lên dropbox và gửi lên với nội dung comment là tên máy.
vd : K43SJ.zip : <link>.

 
Last edited by a moderator:
Patch DSDT.
Việc patch DSDT là điều được khuyên nên làm với bất kì hệ thống hackintosh.

Tóm tắc công việc chính :
->Thiết lập cho LVDS ( LVDS chính là cổng nối tín hiệu xuất ra màn hình lap của bạn)
-> Xác định số lượng màn hình
-> Thiết lập tham số cho từng màn hình
-> xác định và thiết lập NVCAP
-> Thiết lập VRAM
-> Thiết lập thêm các thông tin khác.
-> Thiết lập HDAU.

Thực hiện
Đây là một template method _DSM để patch :
Mã:
Method (_DSM, 4, NotSerialized)
                    {
                        Store (Package (0x3E)
                            {
                                "AAPL,backlight-control",
                                Buffer (0x04)
                                {
                                    0x01, 0x00, 0x00, 0x00
                                },

                                "@0,backlight-control",
                                Buffer (0x04)
                                {
                                    0x01, 0x00, 0x00, 0x00
                                },

                                "AAPL,aux-power-connected",
                                Buffer (0x04)
                                {
                                    0x01, 0x00, 0x00, 0x00
                                },

                                "@0,AAPL,boot-display",
                                Buffer (One)
                                {
                                    0x01
                                },

                                "@0,display-cfg",
                                Buffer (0x04)
                                {
                                    0xFF, 0xFF, 0x36, 0x00
                                },

                                "@1,display-cfg",
                                Buffer (0x04)
                                {
                                    0xFF, 0xFF, 0xFF, 0xFF
                                },

                                "@0,connector-type",
                                Buffer (0x04)
                                {
                                    0x00, 0x08, 0x00, 0x00
                                },

                                "@1,connector-type",
                                Buffer (0x04)
                                {
                                    0x00, 0x08, 0x00, 0x00
                                },

                                "@0,built-in",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x01
                                },

                                "@0,use-backlight-blanking",
                                Buffer (0x04) {},
                                "AAPL,gray-page",
                                Buffer (0x04)
                                {
                                    0x01, 0x00, 0x00, 0x00
                                },

                                "AAPL00,inverter",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x00
                                },

                                "@1,can-hot-plug",
                                Buffer (0x04) {
                                    0x01, 0x00, 0x00, 0x00
                                },
                                "AAPL00,blackscreen.preferences",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x08
                                },

                                "AAPL01,blackscreen.preferences",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x08
                                },

                                "@0,pwm-info",
                                Buffer (0x18)
                                {
                                    /* 0000 */    0x02, 0x18, 0x00, 0x64, 0x90, 0x59, 0x02, 0x00,
                                    /* 0008 */    0x08, 0x52, 0x00, 0x00, 0xA5, 0x1C, 0x00, 0x00,
                                    /* 0010 */    0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
                                },                       

                               "@0,compatible",
                                Buffer (0x0B)
                                {
                                    "NVDA,NVMac"
                                },
                          
                                "@0,display-type",
                                Buffer (0x04)
                                {
                                    "LCD"
                                },

                                "@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 */    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
                                    /* 0008 */    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
                                    /* 0010 */    0x00, 0x00, 0x00, 0x00
                                },

                                "VRAM,totalsize",
                                Buffer (0x04)
                                {
                                    0x00, 0x00, 0x00, 0x40
                                },

                                "device_type",
                                Buffer (0x0C)
                                {
                                    "NVDA,Parent"
                                },

                                "model",
                                Buffer (0x17)
                                {
                                    "NVIDIA GeForce GT 520M"
                                },

                                "hda-gfx",
                                Buffer (0x0A)
                                {
                                    "onboard-2"
                                },

                                "rom-revision",
                                Buffer (0x0F)
                                {
                                    "75.19.11.00.14"
                                }
                            }, Local0)
                        DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                        Return (Local0)
                    }


-> 1. Thiết lập cho LVDS.
+ Nếu màn hình của bạn có độ phân giải 1366x768 bạn có thể bỏ qua bước này.
+ Nếu màn hình của bạn có độ phân giải trên 1366x768 (1600x900 , 1920x1080 v.v... ) bạn thêm vào DSDT
Mã:
"@AAPL00,DualLink",     
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},
Một số card quadro nên thêm

Mã:
"AAPL,HasLid",
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},
"AAPL,HasPanel",
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},

-> 2.Xác định số lượng màn hình.
Đây sẽ là phần hại não - tốn calo nhất.
Các bạn để ý
Đầu tiên là số lượng và thứ tự màn hình của bạn với từ khoá "nvda":
ví dụ như với K43SJ có 2 Display A vs B

Screen%20Shot%202015-03-29%20at%209.12.07%20PM_zpspyfsvxxq.png
với 8570W thì khác có tới 4 Display A, B, C, D.
Screen%20Shot%202015-03-29%20at%209.11.48%20PM_zpsywb0fwpl.png
Các bạn chú ý đến tham số IOFBDependentIntex của từng display.
Thật ra không cần chú ý cũng được vậy :v vì dễ dàng phát hiện ra số thứ tự này đánh từ trên xuống
A:00, B:01, C:02, D:03.

Nhìn vào template method _DSM ở trên dễ dàng thấy.
"@0....." quản lí Display A : sẽ liên quan đến LVDS lúc nào cũng vậy.
"@1....." quản lí Display B : sẽ quản lý liên quan đến HDMI/DP
"@2....." quản lí Display B : sẽ quản lý liên quan đến HDMI/DP
"@3....." quản lí Display B : sẽ quản lý liên quan đến HDMI/DP

* Quái nhỉ, cổng VGA sẽ nằm ở Display nào ? - coi như nó chả được quản lý bởi Display nào đi. Về cơ bản thì chả có con Mac nào có cổng VGA cả, tí nữa xuất được ra cổng VGA hay không phụ thuộc phần lớn vào NVCAP tí nữa sẽ xét.

-> 3.Thiết lập tham số cho từng màn hình
+ LVDS ( Display A ):
Mã:
"AAPL,backlight-control",
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},
"@0,backlight-control",   
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},
"@0,AAPL,boot-display",   
Buffer (One)
{
    0x01
},

"@0,built-in",           
Buffer (One)
{
    0x01
},
"@0,use-backlight-blanking",
Buffer (One)
{
    0x01
},
"@0,device_type",         
Buffer (0x08)
{
    "LCD"
},
"@0,compatible",         
Buffer (0x0B)
{
    "NVDA,NVMac"
},                         
"@0,name",               
Buffer (0x0F)
{
    "NVDA,Display-A"
},
Thường thì như vậy là đủ vì cả driver mặc định của Apple hay Webdriver đều native với LVDS.
Bạn nên thêm một số thông tin về LVDS :
Mã:
"@0,display-cfg",
Buffer (0x04)
{
    0xFF, 0xFF, 0x36, 0x00
},
"@0,pwm-info",
Buffer (0x18)
{
    /* 0000 */    0x02, 0x18, 0x00, 0x64, 0x90, 0x59, 0x02, 0x00,
    /* 0008 */    0x08, 0x52, 0x00, 0x00, 0xA5, 0x1C, 0x00, 0x00,
    /* 0010 */    0x00, 0x04, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
},

với màn hình độ phân giải trên 1366x768 (1600x900 , 1920x1080 v.v... ) có thể thử :
Mã:
"@0,pwm-info",         
Buffer (0x14)
{
    /* 0000 */  0x01, 0x14, 0x00, 0x64, 0xA8, 0x61, 0x00, 0x00,
    /* 0008 */  0x08, 0x52, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
    /* 0010 */  0x00, 0x04, 0x00, 0x00
},

* pwm-info liên quan đến tăng giảm độ sáng
* display-cfg liên quan đến việc xuất ra màn hình ngoài

+ Display B
Mã:
"@1,device_type",     
Buffer (0x08)
{
    "display"
},
"@1,compatible",       
Buffer (0x0B)
{
    "NVDA,NVMac"
},                       
"@1,name",             
Buffer (0x0F)
{
    "NVDA,Display-B"
},
"@1,display-cfg",
Buffer (0x04)
{
    0xFF, 0xFF, 0xFF, 0xFF
},
"@1,connector-type",
Buffer (0x04)
{
    0x00, 0x08, 0x00, 0x00
},
"@1,can-hot-plug",
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},
+ Display C
Mã:
"@2,device_type",     
Buffer (0x08)
{
    "display"
},
"@2,compatible",       
Buffer (0x0B)
{
    "NVDA,NVMac"
},                       
"@2,name",             
Buffer (0x0F)
{
    "NVDA,Display-C"
},
"@2,display-cfg",
Buffer (0x04)
{
    0xFF, 0xFF, 0xFF, 0xFF
},
"@2,connector-type",
Buffer (0x04)
{
    0x00, 0x08, 0x00, 0x00
},
"@2,can-hot-plug",
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},
+ Display D
Mã:
"@3,device_type",     
Buffer (0x08)
{
    "display"
},
"@3,compatible",       
Buffer (0x0B)
{
    "NVDA,NVMac"
},                       
"@3,name",             
Buffer (0x0F)
{
    "NVDA,Display-D"
},
"@3,display-cfg",
Buffer (0x04)
{
    0xFF, 0xFF, 0xFF, 0xFF
},
"@3,connector-type",
Buffer (0x04)
{
    0x00, 0x08, 0x00, 0x00
},
"@3,can-hot-plug",
Buffer (0x04)
{
    0x01, 0x00, 0x00, 0x00
},


Thấy đơn giản là tăng số thứ tự của các port và thay đổi "name" tương ứng.
* cái này chính xác với ioreg có 2 Display, mình chưa có điều kiện thử trên máy có nhiều display

-> 4. Xác định và thiết lập NVCAP

NVCAP xác định được từ bước chuẩn bị.
Copy ra và thêm vào như thế này:
Mã:
NVCAP",
Buffer (0x18)
{
    /* 0000 */    0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,
    /* 0008 */    0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
    /* 0010 */    0x00, 0x00, 0x00, 0x00
},

-> 5. Thiết lập thêm thông tin khác
Mã:
"VRAM,totalsize",
Buffer (0x04)
{
    0x00, 0x00, 0x00, 0x40
},

"device_type",
Buffer (0x0C)
{
    "NVDA,Parent"
},

"model",
Buffer (0x17)
{
    "NVIDIA GeForce GT 520M"
},

"hda-gfx",
Buffer (0x0A)
{
    "onboard-2"
},

"rom-revision",
Buffer (0x0F)
{
    "75.19.11.00.14"
}
*VRAM,totalsize : tổng dung lượng VRAM 0x80 = 2GB, 0x40 = 1GB, 0x20 = 512MB, 0x10 = 256MB.
* device_type thì là hardcode
*model là tên card .
*hda-gfx phục vụ cho việc xuất hdmi audio. có 2 giá trị nên thử "onboard-1" và "onboard-2"
*rom-revsion thì sửa cũng được mà kệ nó cũng chẳng sao - thường là vậy.

-> 6. Thêm HDAU - quản lý HDMI Audio
+ bước thứ 6 này có thể không cần thiết với các CPU cũ hơn core i gen 4 (ivy, sandy v.v... ).
device này thêm vào ngay bên dưới của GFX0 / DGFX0 /...
Mã:
Device (HDAU)
                {
                    Name (_ADR, One)
                    Method (_PRW, 0, NotSerialized)
                    {
                        Return (GPRW (0x09, 0x04))
                    }

                    Method (_DSM, 4, NotSerialized)
                    {
                        If (LEqual (Arg2, Zero))
                        {
                            Return (Buffer (One)
                            {
                                0x03
                            })
                        }

                        Store (Package (0x04)
                            {
                                "layout-id",
                                Buffer (0x04)
                                {
                                    0x1C, 0x00, 0x00, 0x00
                                },

                                "hda-gfx",
                                Buffer (0x0A)
                                {
                                    "onboard-2"
                                }
                            }, Local0)
                        DTGP (Arg0, Arg1, Arg2, Arg3, RefOf (Local0))
                        Return (Local0)
                    }
                }
*layout-id để trùng với layout-id của AppleHDA.
* hda-gfx giống mục 5

gom góp lại cuối cùng ta được một method _DSM như trên template :

đặt nó vào trong device GFX0 như thế này.
Screen%20Shot%202015-03-29%20at%209.16.39%20PM_zpsgfd1k7ty.png

Tất nhiên sau tất cả chúng ta sẽ Apply Method DTGP
 
Last edited:
  • Like
Reactions: bachduong
Thiết lập trong config:
Add NVCAP

Card nVidia hầu như khá dễ tính, chỉ cần đơn thuần chọn inject nVidia là đã tự động nhận.
*Một số trường hợp nhỏ k cần chọn inject cũng nhận.
*Một số trường hợp khác nếu nhận card nhưng VRAM =0MB thì cũng bỏ không tích vài inject nVidia.
Nếu add NVCAP trên DSDT không hiệu quả (hoặc bạn k biết patch DSDT) thì có thể add NVCAP vào config như trong hình
Screen%20Shot%202015-07-02%20at%201.35.23%20AM_zpsjo4ajxxc.png

Disable ECC memory:
Patch on the fly là thế mạnh của Clover, ta sẽ áp dụng nó cho việc Patch AppleTyMCEDriver.kext, việc này loại bỏ khả năng panic bởi cơ chế kiểm tra bộ nhớ ECC nếu bạn dùng SMBIOS MacPro.

Name: AppleTyMCEDriver
Find: 720A004D616350726F342C31004D616350726F352C310058
Replace: 720A00000000000000000000000000000000000000000058
Comment: Disable ECC Memory in MacPro SMBIOS

Bạn thêm như trong hình:
Screen%20Shot%202015-07-02%20at%201.38.17%20AM%20copy_zpscrx6b1is.png
 
Last edited:
  • Like
Reactions: bachduong
Cài Webdriver:
Cùng với Kext mặc định của Apple, nVidia tỏ ra khá chăm chút cho những đứa con cưng khi mà support cho Mac OS X hẳn một gói driver riêng. Vậy là hầu như người dùng sẽ không phải patch gì mấy, thao tác kéo thả, click nút next next rất nhiều.

Hầu hết card Fermi được support khá tốt với kext mặc định cho nVidia của Apple. Nhưng nếu bạn không dùng card Fermi, ví dụ như Tesla, Kepler, Maxwell... thì đừng lo đã có webdriver.

Link Download: Fshare - nhớ chọn đúng phiên bản phù hợp.

Cách cài:
+ Chuyển SMBIOS về Macpro 5.1 -> reboot -> cài webdriver -> thiết lập config (như #2 và thêm nvda_drv=1) -> chuyền SMBIOS về SMBIOS ban đầu ->reboot
Hoặc:
+Chạy file NVidiaWebdriverModder.sh dưới quyền root user - file này có mục đích là giúp bạn không cần phải chuyển về SMBIOS MacPro mà vẫn có thể cài được Webdriver. (đừng quên thêm --skip-version-check như hình)

Screen%20Shot%202015-07-02%20at%202.25.48%20AM_zpsddpjikea.png

Thiết lập Config như #2.
Ngoài ra thêm bootflag : nvda_drv=1 trong config.
Screen%20Shot%202015-07-02%20at%202.06.55%20AM_zpszddtqxfz.jpg
Sau đó cài Webdriver và reboot.
 

Attachments

  • NVidiaWebdriverModder_1.0.zip
    1.9 KB · Xem: 131
Last edited:
fix AGMP...............
 
  • Like
Reactions: bachduong
bài viết của bạn quá hay. up tiếp đi bạn ơi. mình đang kẹt chưa biết sử con nvidia geforce 210 thế nào.
 
bài viết của bạn quá hay. up tiếp đi bạn ơi. mình đang kẹt chưa biết sử con nvidia geforce 210 thế nào.
bachduongnvidia geforce 210 bị gì thế!? không nhận!?
 
  • Like
Reactions: bachduong
mình dùng clover. bạn giúp mình với. mình kẹt vụ QE/CI lâu rồi mà ko sao bật đc
bachduonggỡ patch trong dsdt đi! mở config.plist bằng clover configurator, tích inject nvidia, mua thêm cái chuyển dvi sang vga! thế là lên!
 
  • Like
Reactions: bachduong
Con gtx 460 của mình chạy cứ phải nv_disable=1 nó mới vào được, còn không màn hình nó đen thui lúc boot, fix thế nào đây các bác??
 
Con gtx 460 của mình chạy cứ phải nv_disable=1 nó mới vào được, còn không màn hình nó đen thui lúc boot, fix thế nào đây các bác??
conco119cài webdriver vào
 
Tối qua mới kích được đúng dung lượng con Zotac :). Thanks thớt.
Để tối nay về mò xem có xuất được 2 cổng của con Zotac cùng lúc không :).
 
Đã test thử: 2 cổng DVI đều hoạt động cùng lúc :D.
Mà con VGA của mình có 3 cổng ( 2 DVI + 1 Mini HDMI ). Nhưng trong IOReg chỉ thấy có 2 cổng. Không biết cổng Mini HDMI active thế nảo? Bác thớt chỉ giúp mình với.
 
Đã test thử: 2 cổng DVI đều hoạt động cùng lúc :D.
Mà con VGA của mình có 3 cổng ( 2 DVI + 1 Mini HDMI ). Nhưng trong IOReg chỉ thấy có 2 cổng. Không biết cổng Mini HDMI active thế nảo? Bác thớt chỉ giúp mình với.
quocnam_vnnbỏ tích khỏi inject Nvidia xem nó hiện mấy cổng ?