Vietnamese (machine translation)

Lưu ý

Mục đích của file này là để độc giả tiếng Việt có thể đọc và hiểu tài liệu nhân kernel dễ dàng hơn, không phải để tạo ra một nhánh tài liệu riêng. Nếu bạn có bất kỳ nhận xét hoặc cập nhật nào cho file này, vui lòng thử cập nhật file tiếng Anh gốc trước. Nếu bạn thấy có sự khác biệt giữa bản dịch và bản gốc, hoặc có vấn đề về bản dịch, vui lòng gửi góp ý hoặc patch cho người dịch của file này, hoặc nhờ người bảo trì và người review tài liệu tiếng Việt giúp đỡ.

Bản gốc:

Debugging AMD Zen systems

Người dịch:

Google Translate (machine translation)

Phiên bản gốc:

8541d8f725c6

Cảnh báo

Tài liệu này được dịch tự động bằng máy và chưa được review bởi người dịch. Nội dung có thể không chính xác hoặc khó hiểu ở một số chỗ. Khi có sự khác biệt với bản gốc, bản gốc luôn là chuẩn. Bản dịch chất lượng cao (được review) được đặt trong thư mục vi_VN/.

18. Gỡ lỗi hệ thống AMD Zen

18.1. Giới thiệu

Tài liệu này mô tả các kỹ thuật hữu ích để gỡ lỗi các vấn đề với Hệ thống Zen AMD. Nó được thiết kế để sử dụng bởi các nhà phát triển và người dùng kỹ thuật để giúp xác định và giải quyết vấn đề.

18.2. S3 vs s2idle

Trên các hệ thống AMD, không thể hỗ trợ đồng thời hệ thống treo cho RAM (S3) và tạm dừng ở chế độ không hoạt động (s2idle). Để xác nhận chế độ nào hệ thống của bạn hỗ trợ bạn có thể nhìn vào ZZ0000ZZ. Nếu nó hiển thị ZZ0001ZZ thì ZZ0003ZZ được hỗ trợ. Nếu nó hiển thị ZZ0002ZZ thì ZZ0004ZZ là được hỗ trợ.

Trên các hệ thống hỗ trợ ZZ0000ZZ, phần sụn sẽ được sử dụng để đưa tất cả phần cứng vào trạng thái năng lượng thấp thích hợp.

Trên các hệ thống hỗ trợ ZZ0000ZZ, kernel sẽ chịu trách nhiệm chuyển đổi các thiết bị sang trạng thái năng lượng thấp thích hợp. Khi tất cả các thiết bị ở mức thấp thích hợp trạng thái nguồn, phần cứng sẽ chuyển sang trạng thái ngủ phần cứng.

Sau chu kỳ tạm dừng, bạn có thể biết lượng thời gian đã dành cho chế độ ngủ phần cứng trạng thái bằng cách nhìn vào ZZ0000ZZ.

Sơ đồ này giải thích cách hoạt động của luồng tạm dừng AMD s2idle.

../../../../_images/suspend1.svg

Sơ đồ này giải thích cách hoạt động của luồng tiếp tục AMD s2idle.

../../../../_images/resume1.svg

18.3. công cụ gỡ lỗi s2idle

Vì có rất nhiều nơi có thể xảy ra sự cố nên một công cụ gỡ lỗi đã được cung cấp. được tạo ra tại ZZ0000ZZ có thể giúp kiểm tra các vấn đề thường gặp và đưa ra đề xuất.

Nếu bạn gặp vấn đề về s2idle, tốt nhất bạn nên bắt đầu với vấn đề này và làm theo hướng dẫn từ những phát hiện của nó. Nếu bạn tiếp tục gặp sự cố, hãy khắc phục lỗi với báo cáo được tạo từ tập lệnh này tới ZZ0000ZZ.

18.4. Đánh thức s2idle giả từ IRQ

Các lần đánh thức giả thường sẽ có IRQ được đặt thành ZZ0000ZZ. Điều này có thể được so khớp với ZZ0001ZZ để xác định thiết bị nào đã đánh thức hệ thống.

Nếu điều này không đủ để khắc phục sự cố thì các tệp sysfs sau có thể được đặt để tăng thêm mức độ chi tiết cho quá trình đánh thức:

# echo 1 | sudo tee /sys/power/pm_debug_messages

# echo 1 | sudo tee /sys/power/pm_print_times

Sau khi thực hiện những thay đổi đó, kernel sẽ hiển thị các thông báo có thể được truy trở lại mã vòng lặp kernel s2idle cũng như hiển thị bất kỳ hoạt động nào Nguồn GPIO khi thức dậy.

Nếu việc đánh thức là do ACPI SCI gây ra, việc gỡ lỗi ACPI bổ sung có thể là cần thiết. Các lệnh này có thể kích hoạt dữ liệu theo dõi bổ sung:

Kích hoạt # echo | Sudo tee /sys/module/acpi/parameter/trace_state

# echo 1 | sudo tee /sys/module/acpi/parameters/aml_debug_output # echo 0x0800000f | sudo tee /sys/module/acpi/parameters/debug_level # echo 0xffff0000 | Sudo tee /sys/module/acpi/parameter/debug_layer

18.5. Đánh thức s2idle giả từ GPIO

Nếu GPIO hoạt động khi đánh thức hệ thống thì lý tưởng nhất là bạn nên xem xét sơ đồ để xác định nó được liên kết với thiết bị nào. Nếu sơ đồ không có sẵn, một chiến thuật khác là xem mục nhập ACPI _EVT() để xác định thiết bị nào được thông báo khi GPIO đó hoạt động.

Để có một ví dụ giả định, giả sử GPIO 59 đã đánh thức hệ thống. bạn có thể nhìn vào SSDT để xác định thiết bị nào được thông báo khi GPIO 59 hoạt động.

Đầu tiên chuyển đổi số GPIO thành hex.

$ python3 -c "print(hex(59))"

0x3b

Tiếp theo xác định bảng ACPI nào có mục nhập ZZ0000ZZ. Ví dụ:

$ sudo grep EVT /sys/firmware/acpi/tables/SSDT*

grep: /sys/firmware/acpi/tables/SSDT27: tệp nhị phân khớp

Giải mã bảng này:

$ sudo cp /sys/firmware/acpi/tables/SSDT27 .

$ sudo iasl -d SSDT27

Sau đó nhìn vào bảng và tìm mục nhập phù hợp cho GPIO 0x3b.

Trường hợp (0x3B)
{

M000 (0x393B) M460 (” Thông báo (\_SB.PCI0.GP17.XHC1, 0x02)n”, Không, Không, Không, Không, Không, Không) Thông báo (_SB.PCI0.GP17.XHC1, 0x02) // Đánh thức thiết bị

}

Bạn có thể thấy trong trường hợp này thiết bị ZZ0000ZZ được thông báo khi GPIO 59 hoạt động. Rõ ràng đây là bộ điều khiển XHCI, nhưng để thực hiện bước xa hơn bạn có thể tìm ra bộ điều khiển XHCI nào bằng cách khớp nó với ACPI.:

$ grep "PCI0.GP17.XHC1" /sys/bus/acpi/devices/*/path

/sys/bus/acpi/devices/device:2d/path:_SB_.PCI0.GP17.XHC1 /sys/bus/acpi/devices/device:2e/path:_SB_.PCI0.GP17.XHC1.RHUB /sys/bus/acpi/devices/device:2f/path:_SB_.PCI0.GP17.XHC1.RHUB.PRT1 /sys/bus/acpi/devices/device:30/path:_SB_.PCI0.GP17.XHC1.RHUB.PRT1.CAM0 /sys/bus/acpi/devices/device:31/path:_SB_.PCI0.GP17.XHC1.RHUB.PRT1.CAM1 /sys/bus/acpi/devices/device:32/path:_SB_.PCI0.GP17.XHC1.RHUB.PRT2 /sys/bus/acpi/devices/LNXPOWER:0d/path:_SB_.PCI0.GP17.XHC1.PWRS

Ở đây bạn có thể thấy nó khớp với ZZ0000ZZ. Nhìn vào ZZ0001ZZ để xác định thiết bị PCI thực sự là gì.

$ ls -l /sys/bus/acpi/devices/device:2d/physical_node

lrwxrwxrwx 1 root root 0 12 tháng 2 13:22 /sys/bus/acpi/devices/device:2d/physical_node -> ../../../../../pci0000:00/0000:00:08.1/0000:c2:00.4

Vậy là bạn đã hiểu: thiết bị PCI được liên kết với quá trình đánh thức GPIO này là ZZ0000ZZ.

Tập lệnh ZZ0000ZZ sẽ ghi lại hầu hết các tạo phẩm này cho bạn.

18.6. thông báo gỡ lỗi PM s2idle

Trong quá trình s2idle trên hệ thống AMD, trình điều khiển ACPI LPS0 chịu trách nhiệm để kiểm tra tất cả các ràng buộc uPEP. Việc không thực hiện được các ràng buộc uPEP không ngăn cản được mục nhập s0i3. Điều này có nghĩa là nếu một số ràng buộc không được đáp ứng, có thể kernel có thể cố gắng vào s2idle ngay cả khi có một số vấn đề đã biết.

Để kích hoạt gỡ lỗi PM, hãy chỉ định kernel ZZ0000ZZ tùy chọn dòng lệnh khi khởi động hoặc ghi vào ZZ0001ZZ. Các ràng buộc chưa được đáp ứng sẽ được hiển thị trong nhật ký kernel và có thể được xem bằng các công cụ ghi nhật ký xử lý bộ đệm vòng nhân như ZZ0002ZZ hoặc ZZ0003ZZ.”

Nếu hệ thống bị treo khi vào/ra trước khi các thông báo này bị xóa, một Chiến thuật gỡ lỗi hữu ích là hủy liên kết trình điều khiển ZZ0000ZZ để ngăn chặn thông báo tới nền tảng để bắt đầu nhập s0i3. Điều này sẽ dừng việc hệ thống không bị treo khi vào hoặc thoát và cho phép bạn xem tất cả các lỗi không thành công những hạn chế.

cd /sys/bus/platform/drivers/amd_pmc

ls ZZ0000ZZ sudo tee hủy liên kết

Sau khi thực hiện việc này, hãy chạy chu trình tạm dừng và tìm kiếm cụ thể các lỗi xung quanh:

ACPI: LPI: Không đáp ứng được ràng buộc; trạng thái nguồn tối thiểu:%s trạng thái nguồn hiện tại:%s

18.7. Các ví dụ lịch sử về vấn đề s2idle

Để giúp hiểu các loại sự cố có thể xảy ra và cách gỡ lỗi, đây là một số ví dụ lịch sử về các vấn đề s2idle đã được giải quyết.

18.7.1. Cốt lõi ngoại tuyến

Một người dùng cuối đã báo cáo rằng việc lấy lõi ngoại tuyến sẽ ngăn hệ thống từ việc nhập đúng s0i3. Điều này đã được gỡ lỗi bằng các công cụ AMD nội bộ để nắm bắt và hiển thị luồng số liệu từ phần cứng cho biết những gì đã thay đổi khi lõi đã ngoại tuyến. Người ta xác định rằng phần cứng không nhận được thông báo các lõi ngoại tuyến ở trạng thái sâu nhất và do đó nó đã ngăn chặn CPU đi vào trạng thái sâu nhất. Sự cố đã được sửa lỗi thành thiếu lệnh đưa lõi vào C3 khi ngoại tuyến.

ZZ0000ZZ

18.7.2. Tham nhũng sau khi tiếp tục

Một vấn đề lớn xảy ra với Rembrandt là có đồ họa tham nhũng sau khi tiếp tục. Điều này xảy ra do sự điều chỉnh sai của PSP và trách nhiệm của người lái xe. PSP sẽ lưu và khôi phục DMCUB, nhưng trình điều khiển cho rằng cần thiết lập lại DMCUB khi tiếp tục. Đây thực ra cũng là một sự sai lệch đối với silicon trước đây, nhưng không phải vậy. quan sát thấy.

ZZ0000ZZ

18.7.3. Back to Back đình chỉ không thành công

Khi sử dụng nguồn đánh thức kích hoạt IRQ đánh thức, một lỗi trong Trình điều khiển pinctrl-amd có thể ghi lại trạng thái sai của IRQ và ngăn chặn hệ thống sẽ trở lại chế độ ngủ bình thường.

ZZ0000ZZ

18.7.4. Đánh thức dựa trên bộ đếm thời gian giả sau 5 phút

Tuy nhiên, HPET đang được sử dụng để lập trình nguồn đánh thức cho hệ thống điều này đã gây ra sự thức tỉnh giả sau 5 phút. Báo thức chính xác để sử dụng là báo động ACPI.

ZZ0000ZZ

18.7.5. Đĩa biến mất sau khi tiếp tục

Sau khi tiếp tục từ s2idle, đĩa NVME sẽ biến mất. Điều này là do BIOS không chỉ định thuộc tính _DSD StorageD3Enable. Điều này khiến NVME trình điều khiển không đưa đĩa vào trạng thái dự kiến khi tạm dừng và bị lỗi trên sơ yếu lý lịch.

ZZ0000ZZ

18.7.6. IRQ1 giả

Một số nền tảng Renoir, Lucienne, Cezanne và Barcelo có lỗi phần sụn nền tảng trong đó IRQ1 được kích hoạt trong quá trình tiếp tục s0i3.

Điều này đã được sửa trong phần sụn nền tảng, nhưng một số hệ thống thì không. nhận thêm bất kỳ bản cập nhật chương trình cơ sở nền tảng nào.

ZZ0000ZZ

18.7.7. Hết thời gian chờ phần cứng

Phần cứng thực hiện nhiều hành động bên cạnh việc chấp nhận các giá trị từ trình điều khiển amd-pmc. Vì đường truyền thông với phần cứng là một hộp thư, có thể nó không phản hồi đủ nhanh. Sự cố này được biểu hiện là không thể tạm dừng:

CH: dpm_run_callback(): acpi_subsys_suspend_noirq+0x0/0x50 trả về -110

amd_pmc AMDI0005:00: PM: không thể tạm dừng noirq: lỗi -110

Vấn đề về thời gian được xác định bằng cách so sánh các giá trị của mặt nạ nhàn rỗi.

ZZ0000ZZ

18.7.8. Không thể đạt đến trạng thái ngủ phần cứng khi bật bảng điều khiển

Trên một số hệ thống Strix, người ta quan sát thấy một số bảng nhất định chặn hệ thống khỏi chuyển sang trạng thái ngủ phần cứng nếu bảng điều khiển bên trong được bật trong suốt chuỗi.

Mặc dù bảng điều khiển đã bị tắt trong quá trình tạm dừng nhưng nó vẫn gặp vấn đề về thời gian trong đó một sự gián đoạn khiến phần cứng màn hình thức dậy và chặn nguồn điện thấp nhập cảnh của nhà nước.

ZZ0000ZZ

18.8. Vấn đề tiêu thụ năng lượng trong thời gian chạy

Mức tiêu thụ điện năng trong thời gian chạy bị ảnh hưởng bởi nhiều yếu tố, bao gồm nhưng không giới hạn ở cấu hình của Quản lý năng lượng trạng thái hoạt động PCIe (ASPM), độ sáng màn hình, chính sách EPP của CPU và quản lý năng lượng của các thiết bị.

18.8.1. ASPM

Để có mức tiêu thụ điện năng tốt nhất trong thời gian chạy, ASPM phải được lập trình như dự định bởi BIOS từ nhà cung cấp phần cứng. Để thực hiện điều này, nhân Linux nên được biên dịch với ZZ0000ZZ được đặt thành ZZ0001ZZ và Không nên sửa đổi tệp sysfs ZZ0002ZZ.

Đáng chú ý nhất là nếu L1.2 không được cấu hình đúng cách cho bất kỳ thiết bị nào, SoC sẽ sẽ không thể vào trạng thái nhàn rỗi sâu nhất.

18.8.2. Chính sách EPP

Tệp sysfs ZZ0000ZZ có thể được sử dụng để đặt độ lệch về hiệu quả hoặc hiệu suất cho CPU. Điều này có mối quan hệ trực tiếp đến thời lượng pin khi thiên về hiệu suất hơn.

18.9. Thông báo gỡ lỗi BIOS

Hầu hết các máy OEM không có UART nối tiếp để xuất kernel hoặc BIOS thông báo gỡ lỗi. Tuy nhiên, thông báo gỡ lỗi BIOS rất hữu ích để hiểu cả lỗi BIOS và lỗi với trình điều khiển nhân Linux gọi BIOS AML.

Vì BIOS trên hầu hết các hệ thống OEM AMD đều dựa trên AMD tham chiếu BIOS, cơ sở hạ tầng được sử dụng để xuất thông báo gỡ lỗi thường giống nhau như AMD tham chiếu BIOS.

18.9.1. Phân tích cú pháp thủ công

Nói chung có một phương pháp ACPI ZZ0000ZZ mà các đường dẫn khác nhau của AML sẽ gọi để phát ra một thông báo tới nhật ký nối tiếp BIOS. Phương pháp này mất 7 đối số, với đối số đầu tiên là một chuỗi và phần còn lại là tùy chọn số nguyên:

Phương thức (M460, 7, được tuần tự hóa)

Dưới đây là ví dụ về chuỗi mà BIOS AML có thể gọi ra bằng ZZ0000ZZ:

M460 (” Địa chỉ OEM-ASL-PCIe (0x%X)._REG (%d %d) PCSA = %dn”, DADR, Arg0, Arg1, PCSA, Zero, Zero)

Thông thường khi được thực thi, phương thức ZZ0000ZZ sẽ điền thêm đối số vào chuỗi. Để nhận được những tin nhắn này từ Linux kernel một hook đã được thêm vào ACPICA có thể bắt được ZZ0002ZZ được gửi tới ZZ0001ZZ và in chúng vào bộ đệm vòng hạt nhân. Ví dụ: thông báo sau có thể được phát vào bộ đệm vòng kernel

extrace-0174 ex_trace_args : “ Địa chỉ OEM-ASL-PCIe (0x%X)._REG (%d %d) PCSA = %dn”, ec106000, 2, 1, 1, 0, 0

Để nhận được những tin nhắn này, bạn cần biên dịch bằng ZZ0000ZZ rồi bật các tham số theo dõi ACPICA sau đây. Điều này có thể được thực hiện trên dòng lệnh kernel hoặc trong thời gian chạy:

  • ZZ0000ZZ

  • ZZ0001ZZ

NOTE: Chúng có thể rất ồn khi khởi động. Nếu bạn bật các thông số này lệnh kernel, vui lòng xem xét việc bật ZZ0000ZZ lên kích thước lớn hơn chẳng hạn như 17 để tránh mất thông báo khởi động sớm.

18.9.2. Phân tích cú pháp được hỗ trợ bởi công cụ

Như đã đề cập ở trên, việc phân tích cú pháp bằng tay có thể tẻ nhạt, đặc biệt với rất nhiều tin nhắn. Để trợ giúp việc này, một công cụ đã được tạo ra tại ZZ0000ZZ để giúp phân tích các tin nhắn.

18.10. Sự cố khởi động lại ngẫu nhiên

Khi xảy ra khởi động lại ngẫu nhiên, lý do cấp cao cho việc khởi động lại sẽ được lưu trữ trong một sổ đăng ký sẽ tồn tại ở lần khởi động tiếp theo.

Có 6 loại lý do cho việc khởi động lại:
  • Phần mềm gây ra

  • Chuyển đổi trạng thái nguồn

  • Pin cảm ứng

  • Phần cứng gây ra

  • Đặt lại từ xa

  • Sự kiện CPU nội bộ

Bit

Type

Reason

0

Pin

thermal pin BP_THERMTRIP_L was tripped

1

Pin

power button was pressed for 4 seconds

2

Pin

shutdown pin was tripped

4

Remote

remote ASF power off command was received

9

Internal

internal CPU thermal limit was tripped

16

Pin

system reset pin BP_SYS_RST_L was tripped

17

Software

software issued PCI reset

18

Software

software wrote 0x4 to reset control register 0xCF9

19

Software

software wrote 0x6 to reset control register 0xCF9

20

Software

software wrote 0xE to reset control register 0xCF9

21

ACPI-state

ACPI power state transition occurred

22

Pin

keyboard reset pin KB_RST_L was tripped

23

Internal

internal CPU shutdown event occurred

24

Hardware

system failed to boot before failed boot timer expired

25

Hardware

hardware watchdog timer expired

26

Remote

remote ASF reset command was received

27

Internal

an uncorrected error caused a data fabric sync flood event

29

Internal

FCH and MP1 failed warm reset handshake

30

Internal

a parity error occurred

31

Internal

a software sync flood event occurred

Thông tin này được kernel đọc khi khởi động và in vào nhật ký hệ thống. Khi xảy ra khởi động lại ngẫu nhiên, thông báo này có thể hữu ích để xác định thành phần tiếp theo cần gỡ lỗi.