Ho sentito molto parlare delle stranezze PCI quando leggo del kernel Linux, ma nessun sito web spiega o definisce le stranezze PCI. Cosa sono le stranezze PCI?
Ho sentito molto parlare delle stranezze PCI quando leggo del kernel Linux, ma nessun sito web spiega o definisce le stranezze PCI. Cosa sono le stranezze PCI?
Risposte:
Le "stranezze" sono attributi di un dispositivo considerati non conformi al funzionamento previsto.
Ecco un esempio da 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 */
}
Questa è una "stranezza" in quanto il dispositivo segnala errori spuri. Quando questo dispositivo è operativo, la stranezza imposta alcuni attributi che fanno agire diversamente altre parti del kernel (forse ignorando errori spuri o aggirando un problema noto).
Tuttavia, non tutte le stranezze nel kernel Linux sono così. Invece di disabilitare semplicemente la funzionalità interessata, alcuni tentano di aggirarla, ad esempio:
/*
* 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");
}
}
PCI quirk workarounds
nel kernel?
quirks.c
il fornitore e / o il dispositivo. La disabilitazione delle stranezze potrebbe avere un effetto diverso a seconda della gravità della soluzione alternativa; potrebbe non avere effetti collaterali evidenti o potrebbe causare il malfunzionamento del dispositivo.
CONFIG_PCI_QUIRKS
rientro nel kernel risolve il problema.