# Hack giả mạo card màn hình AMD để chạy được macOS (SSDT-GPU-SPOOF)
Bản vá này cần thiết cho các loại card màn hình của AMD không được macOS hỗ trợ mặc định do tên gọi/mã định danh phần cứng của tụi nó không nằm trong danh sách hỗ trợ kext của Apple, tuy nhiên về cơ bản thông số của tụi nó cũng gần giống/tương đương card màn hình của AMD thiết kế riêng cho máy Mac, phổ biến nhất là các dòng:
- R9 290/390
- R9 280/380
- R7 270/370
- R9 260/360
- R7 250
- R7 240
Thay vào đó, các GPU này cần được "SPOOF" (Giả danh) thành một model (mẫu) khác có cấu trúc gần giống nhất với tụi nó—thường sẽ là biến thể dòng "X" của chính chiếc card đó. Vì một lý do củ chuối gì đó, Apple không bao giờ bận tâm tới chuyện bổ sung PCI ID (Mã định danh PCI) cho các dòng card này vào trong kext, dù nhân đồ họa (GPU cores) của tụi nó về mặt kỹ thuật hoàn toàn được trình điều khiển (driver) của macOS hỗ trợ.
Để làm cho card màn hình "tái xuất giang hồ", chúng ta cần tìm một vài thông tin sau:
- (Mã định danh PCI) phù hợp với card màn hình của bạn.
- Đường dẫn ACPI của card màn hình
- SSDT-GPU-SPOOF (opens new window)
# Kiếm mã định danh PCI phù hợp
# Tìm qua trang web
Để tìm PCI ID (Mã định danh PCI) phù hợp cho card, chúng ta sẽ sử dụng PCI ID Repository (opens new window) - một cơ sở dữ liệu khổng lồ về toàn bộ GPU của AMD. Trong ví dụ này, chúng ta sẽ tạo một bản vá giả danh cho chiếc R9 390. Để biết danh sách đầy đủ các GPU được hỗ trợ, vui lòng đọc Hướng dẫn chọn mua card màn hình (opens new window). Phiên bản gần giống nhất với con card này là 390X (được macOS hỗ trợ đầy đủ), khi tra cứu trên trang web, chúng ta có kết quả ở gần phía đầu trang như sau:
Vendor 1002 -> Device 1002:67b0
Bây giờ, hãy phân tích nó thành một device ID (mã định danh thiết bị) mà chúng ta có thể sử dụng:
1002: Vendor ID (Mã định danh nhà sản xuất), tất cả các thiết bị của AMD đều có mã này67B0: Device ID (Mã định danh thiết bị), đây chính là thứ chúng ta cần quan tâm.
Vậy làm thế nào để chuyển cái mã này thành một ID giả (fake ID)? Định dạng của một ID giả sẽ như sau:
"device-id",
Buffer (0x04)
{
0xB0, 0x67, 0x00, 0x00
},
Như bạn thấy, các byte đã được tráo đổi theo từng cặp (67 B0 thành B0 67). Hãy nhớ kỹ điều này khi chúng ta tiến hành tạo SSDT.
Giải mã kỹ thuật: Việc tráo đổi này là do quy tắc Thứ tự lưu trữ byte (opens new window) — dành cho những bạn nào tò mò về lập trình hệ thống.
# Tìm bằng Linux
Nếu bạn có thể chạy Linux thì hay quá, hãy sử dụng lệnh lspci -vmmnnD -d 1002::0300
$ lspci -vmmnnD -d 1002::0300
Slot: 0000:01:00.0
Class: VGA compatible controller [0300]
Vendor: Advanced Micro Devices, Inc. [AMD/ATI] [1002]
Device: Oland [Radeon HD 8570 / R7 240/340 / Radeon 520 OEM] [6611]
SVendor: Micro-Star International Co., Ltd. [MSI] [1462]
SDevice: Device [3740]
Rev: 87
Từ đây bạn có thể dễ dàng lấy được những thông tin bổ ích như:
- Slot ID
0000:01:00.0, mã định danh khe cắm (chúng ta sẽ cần nó sau). - Vendor ID
1002, tất cả các thiết bị của AMD đều có mã này. - Device ID
6611, đây chính là thứ chúng ta cần quan tâm. - Device name
Radeon HD 8570 / R7 240/340 / Radeon 520 OEM, thông tin này chủ yếu để hiển thị cho đẹp.
# Tìm đường dẫn ACPI của card màn hình
# Tìm bằng Windows
Việc tìm đường dẫn PCI của GPU khá là đơn giản, cách tốt nhất là bạn nên tìm bằng Windows:
- Mở Device Manager (Trình quản lý thiết bị)
- Chọn Display Adapters, sau đó chuột phải vào GPU của bạn và chọn Properties (thuộc tính)
- Tại thẻ Details, tìm mục "Location Paths" (Đường dẫn vị trí).
- Lưu ý: Một số card màn hình có thể giấu đường dẫn ACPI dưới mục "BIOS device name".


Cái dòng "ACPI" thứ hai chính là thứ chúng ta cần:
ACPI(_SB_)#ACPI(PC02)#ACPI(BR2A)#ACPI(PEGP)#PCI(0000)#PCI(0000)
Việc chuyển đổi sang đường dẫn ACPI rất đơn giản: bỏ đi các phần #ACPI và #PCI(0000):
\_SB_.PC02.BR2A.PEGP
# Tìm bằng Linux
Thay thế cái SLOT ID bạn tìm thấy ở bước trước vào lệnh cat /sys/bus/pci/devices/SLOTID/firmware_node/path, bạn có thể lấy được thông tin
$ cat /sys/bus/pci/devices/0000:01:00.0/firmware_node/path
\_SB_.PC02.BR2A.PEGP
Và vậy là xong! Chúng ta đã có đủ nguyên liệu cần thiết để bắt đầu "nấu nướng".
# Tiến hành tạo SSDT
Đầu tiên, bạn tải tệp SSDT-GPU-SPOOF (opens new window) và mở nó lên. Có một vài chỗ bạn cần sửa như sau:
External (_SB_.PCI0, DeviceObj)
External (_SB_.PCI0.PEG0.PEGP, DeviceObj)
Trong ví dụ này, chúng ta sẽ thay thế tất cả các từ sau:
PCI0sửa thànhPC02PEG0sửa thànhBR2A
Mẹo nhỏ: Nếu đường dẫn ACPI (ACPI path) của máy bạn ngắn hơn ví dụ thì cũng không sao cả. Chỉ cần đảm bảo các đường dẫn ACPI khớp chính xác với thiết bị của bạn là được.
Giờ thì đường dẫn đã oke, bạn áp dụng ID giả thôi là xong! Có 2 phần cần thay đổi:!!!
Ta có 2 phần cần phải chỉnh sửa:
Device ID (mã định danh thiết bị):
"device-id",
Buffer (0x04)
{
0xB0, 0x67, 0x00, 0x00
},
Model (cái sẽ hiện trong About this Mac):
"model",
Buffer ()
{
"AMD Radeon R9 390" // bạn có thể đổi tên thành card khác nếu muốn để lòe thiên hạ (cho vui)
}
Mục "device-id" sẽ được điền bằng PCI ID mà chúng ta đã tìm thấy ở bước trên (nhớ đổi ngược cặp byte nhé), còn mục "model" để hiển thị tên card cho "oai" trong mục About This Mac thôi.