Danh mục
Chuẩn bị:
- Dump DSDT theo hướng dẫn tại đây.
- Maciasl.
- SSDT-RTC0-RANGE.
Xác định vấn đề:
Các bạn cần xác định vấn đề của mình có thật sự cần dùng SSDT-RTC0 hay không.
B1: Mở SSDT ra và ấn tổ hợp phím Command + F
và gõ từ khóa PNP0B00
nhìn vào dòng _CRS
.

Chúng ta có:
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0070, // Range Minimum 1
0x0070, // Range Maximum 1
0x01, // Alignment 1
0x02, // Length 1
)
IO (Decode16,
0x0074, // Range Minimum 2
0x0074, // Range Maximum 2
0x01, // Alignment 2
0x04, // Length 2
)
IRQNoFlags ()
{8}
})
Các bạn để ý vào các dòngIRQNoFlags
(số vùng bao phủ) và 2 dòngIO (Decode16,
chúng ta có rtc bao phủ 8 vùng là 0x70 (0x007 chính là 0x70 do được viết bằng hex), 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77 ta có:
- Dòng io đầu tiên:
- Bắt đầu ở 0x70.
- Bao gồm 2 vùng.
- Chứa 0x70, 0x71.
- Dòng io thứ hai:
- Bắt đầu ở 0x74.
- Bao gồm 4 vùng.
- Chứa 0x74, 0x75, 0x76, 0x77.
Thiếu 0x72 và 0x73.
Ta cần sửa phạm vi ở dòng io đầu tiên thành 4.
Tìm ACPI Path:
B1: Mở DSDT lên và ấn Command + F
B2: Search các từ khóa sau:
PNP0B00
: Dùng để tìm tên của Device RTC.Name (_ADR, 0x001F0000)
: Dùng để tìm LPC Path (LowPinCount Path).PNP0A08
: Dùng để tìm PCI Path (có thể có nhiều kết quả cùng xuất hiện hãy chọn cái đầu tiên).



Bây giờ chúng ta có các Path của ACPI là rtc,lpc,pci0
Edit SSDT:
B1: Mở SSDT-RTC0 vừa tải ở bước chuẩn bị lên và sửa lại các Path như sau:
//Path mặc định sẽ là
PC00.LPC0.RTC
//chúng ta cần sửa lại là
PCI0.LPC.RTC
B2: Rename trong SSDT:
//Trước khi rename
External (_SB_.PC00.LPC0, DeviceObj) <- Rename
External (_SB_.PC00.LPC0.RTC_, DeviceObj) <- Rename
Scope (_SB.PC00.LPC0) <- Rename
//Sau khi rename
External (_SB_.PCI0.LPC, DeviceObj) <- Renamed
Scope (_SB.PCI0.LPC.RTC) <- Renamed
Scope (_SB.PCI0.LPC) <- Renamed
B3: Tiếp theo search device(ACPI000E)
( hoặcACPI000E
) Nếu DSDT của bạn có dòng này thì
/* <- xóa nó trong ssdt
Scope (RTC)
{
Method (_STA, 0, NotSerialized) // _STA: Status
{
If (_OSI ("Darwin"))
{
Return (Zero)
}
Else
{
Return (0x0F)
}
}
}
*/ <- xóa nó trong ssdt
// Nếu không có thì xóa luôn phần ghi chú này trong ssdt
B4: Chúng ta có phần này:
Name (_CRS, ResourceTemplate () // _CRS: Current Resource Settings
{
IO (Decode16,
0x0070, // Range Minimum 1
0x0070, // Range Maximum 1
0x01, // Alignment 1
0x04, // Length 1 (Expanded to include 0x72 and 0x73)
)
IO (Decode16,
0x0074, // Range Minimum 2
0x0074, // Range Maximum 2
0x01, // Alignment 2
0x04, // Length 2
)
IRQNoFlags ()
{8}
})
// Sửa các giá trị theo phân tích ở bước xác định vấn đề ở đây mình đã sửa dòng io đầu tiên có phạm vi giá trị là 0x04

Chúng ta có:



B5: Save lại dưới dạng file aml theo hướng dẫn tại đây.
B6: Bỏ file SSDT vừa sửa vào EFI ==> OC ==> ACPI và Snapshot lại ( hoặc EFI ==> Clover ==> ACPI ) sau đó Restart.
Lưu ý: Source tham khảo: Fixing System Clocks on HEDT: Manual | Getting Started With ACPI (dortania.github.io) | OpenCorePkg/SSDT-RTC0-RANGE.dsl at master · acidanthera/OpenCorePkg (github.com)
Pingback: Kernel issue - Heavietnam April 2022