Каковы особенности PCI?

10

Я много слышал об особенностях PCI, когда читал о ядре Linux, но ни один веб-сайт не объясняет и не определяет особенности PCI. Каковы особенности PCI?

Девин Кольер Джонсон
источник
1
Причуды - это просто неинтуитивная непоследовательность. Это не технический термин. Возможно, нам нужно увидеть текст, на который вы ссылаетесь, чтобы уточнить, что они говорят. Хотя есть файл, в котором драйверы подпрограмм могут использовать для обхода различных причуд, с которыми они сталкивались на протяжении многих лет. Но, в конечном счете, это просто неформальный термин, используемый в том же смысле, что и обычный английский язык.
Братчли
1
Если вам действительно интересно, этот файл довольно хорошо прокомментирован и объясняет, что делает каждая подпрограмма.
Братчли

Ответы:

14

«Причуды» - это атрибуты устройства, которые считаются несовместимыми с ожидаемой операцией.

Вот пример из 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 */
}

Это «причуды», поскольку устройство сообщает о ложных ошибках. Когда это устройство работает, причудливость устанавливает определенные атрибуты, которые заставляют другие части ядра действовать по-другому (возможно, игнорируя ложные ошибки или обходя известную проблему).

Однако не все причуды в ядре Linux таковы. Вместо того, чтобы просто отключить уязвимую функцию, некоторые пытаются обойти ее, например:

/*
 * 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 - как бы я заметил, что у моего устройства есть особенности PCI? А что будет, если я отключу PCI quirk workaroundsв ядре?
Мартин Вегтер,
Это полностью зависит от того, какое устройство у вас есть. В зависимости от устройства в журнале ядра может появиться сообщение о том, что был применен обходной прием (как во втором примере выше), или его может не быть. Единственный верный способ - найти quirks.cпоставщика и / или устройство. Отключение причуд может иметь различный эффект в зависимости от серьезности обходного пути; он может не иметь заметных побочных эффектов или может привести к неправильной работе устройства.
Рускур
Одним из примеров того, что может произойти, может быть, например, то, что драйвер видеокарты не может прочитать BIOS видеокарты и, в конце концов, не может правильно настроить его. Имея CONFIG_PCI_QUIRKSеще в ядре исправляет вопрос.
PF4Public
То, что случилось бы, является определенным для причуды. Это может быть где угодно, ничего не происходит, зависает / вылетает машина. Технически, из некоторых компонентов можно выпустить немного дыма, что хуже, чем зависание. Каждая запись - это своя конкретная проблема, которая, как предполагается, не связана каким-либо образом с проблемами других брендов или моделей.
old_timer