Quirks PCI là gì?


10

Tôi nghe nhiều về các quirks PCI khi đọc về nhân Linux, nhưng không có trang web nào giải thích hoặc định nghĩa các quirks PCI. Quirks PCI là gì?


1
Một sự châm biếm chỉ là một sự không nhất quán không trực quan. Đây không phải là một thuật ngữ kỹ thuật. Chúng tôi có lẽ sẽ cần phải xem văn bản bạn đang đề cập để giải thích những gì họ đang nói. Mặc dù có một tệp cung cấp các thói quen mà trình điều khiển có thể sử dụng để làm việc xung quanh các quirks khác nhau mà họ đã gặp phải trong nhiều năm qua. Nhưng cuối cùng, nó chỉ là một thuật ngữ không chính thức được sử dụng theo nghĩa tương tự như thuật ngữ tiếng Anh thông thường.
Bratchley

1
Nếu bạn thực sự tò mò, tập tin đó được bình luận khá tốt giải thích những gì mỗi thói quen làm.
Bratchley

Câu trả lời:


14

"Quirks" là các thuộc tính của thiết bị được coi là không tuân thủ với hoạt động dự kiến.

Đây là một ví dụ từ quirks.c:

/* The Mellanox Tavor device gives false positive parity errors
 * Mark this device with a broken_parity_status, to allow
 * PCI scanning code to "skip" this now blacklisted device.
 */
static void quirk_mellanox_tavor(struct pci_dev *dev)
{
        dev->broken_parity_status = 1;  /* This device gives false positives */
}

Đây là một "vấn đề" khi thiết bị báo lỗi giả. Khi thiết bị này hoạt động, việc giải quyết sẽ đặt các thuộc tính nhất định làm cho các phần khác của kernel hoạt động khác đi (có thể bằng cách bỏ qua các lỗi giả hoặc bằng cách khắc phục sự cố đã biết).

Mặc dù vậy, không phải tất cả các quirks trong nhân Linux đều như thế này. Thay vì chỉ đơn giản là vô hiệu hóa tính năng bị ảnh hưởng, một số cố gắng làm việc xung quanh nó, ví dụ:

/*
 * Some CS5536 BIOSes (for example, the Soekris NET5501 board w/ comBIOS
 * ver. 1.33  20070103) don't set the correct ISA PCI region header info.
 * BAR0 should be 8 bytes; instead, it may be set to something like 8k
 * (which conflicts w/ BAR1's memory range).
 */
static void quirk_cs5536_vsa(struct pci_dev *dev)
{
        if (pci_resource_len(dev, 0) != 8) {
                struct resource *res = &dev->resource[0];
                res->end = res->start + 8 - 1;
                dev_info(&dev->dev, "CS5536 ISA bridge bug detected "
                                "(incorrect header); workaround applied.\n");
        }
}

@Chris Down - làm thế nào tôi nhận thấy rằng thiết bị của tôi có các quirks PCI? Và điều gì sẽ xảy ra, nếu tôi vô hiệu hóa PCI quirk workaroundstrong kernel?
Martin Vegter

Điều đó phụ thuộc hoàn toàn vào thiết bị bạn có. Tùy thuộc vào thiết bị, có thể có một thông báo trong nhật ký kernel đề cập đến một cách giải quyết vấn đề đã được áp dụng (như trong ví dụ thứ hai ở trên), hoặc có thể không có. Cách chắc chắn duy nhất là nhìn vào quirks.cnhà cung cấp và / hoặc thiết bị. Vô hiệu hóa các quirks có thể có tác động khác nhau tùy thuộc vào mức độ nghiêm trọng của cách giải quyết; nó có thể không có tác dụng phụ đáng chú ý hoặc nó có thể khiến thiết bị không hoạt động đúng.
ruscur

Một ví dụ về "điều gì sẽ xảy ra" có thể là, ví dụ, trình điều khiển videocard không thể đọc BIOS videocard và cuối cùng không thể cấu hình đúng cách. Có CONFIG_PCI_QUIRKStrở lại trong kernel khắc phục vấn đề.
PF4Public

Điều gì sẽ xảy ra là cụ thể cho quirk. Nó có thể là bất cứ nơi nào từ không có gì xảy ra với nó bị treo / treo máy. Về mặt kỹ thuật, một số khói có thể thoát ra khỏi một số thành phần còn tệ hơn cả treo. Mỗi mục là một vấn đề cụ thể của riêng nó không được coi là có liên quan theo bất kỳ cách nào đối với các vấn đề thương hiệu hoặc mô hình khác.
old_timer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.