/* * This internal function does not flush PCI writes to the device. All * users must ensure that they read from the device before either assuming * that the device state is up to date, or returning out of this file. * It does not affect the msi_desc::msix_ctrl cache either. Use with care!
*/ staticinlinevoid pci_msix_write_vector_ctrl(struct msi_desc *desc, u32 ctrl)
{ void __iomem *desc_addr = pci_msix_desc_addr(desc);
if (desc->pci.msi_attrib.can_mask)
writel(ctrl, desc_addr + PCI_MSIX_ENTRY_VECTOR_CTRL);
}
/* * PCI 2.3 does not specify mask bits for each MSI interrupt. Attempting to * mask all MSI interrupts by clearing the MSI enable bit does not work * reliably as devices without an INTx disable bit will then generate a * level IRQ which will never be cleared.
*/ staticinline __attribute_const__ u32 msi_multi_mask(struct msi_desc *desc)
{ /* Don't shift by >= width of type */ if (desc->pci.msi_attrib.multi_cap >= 5) return 0xffffffff; return (1 << (1 << desc->pci.msi_attrib.multi_cap)) - 1;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.