162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * MSI[X} related functions which are available unconditionally.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#include "../pci.h"
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci/*
862306a36Sopenharmony_ci * Disable the MSI[X] hardware to avoid screaming interrupts during boot.
962306a36Sopenharmony_ci * This is the power on reset default so usually this should be a noop.
1062306a36Sopenharmony_ci */
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_civoid pci_msi_init(struct pci_dev *dev)
1362306a36Sopenharmony_ci{
1462306a36Sopenharmony_ci	u16 ctrl;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci	dev->msi_cap = pci_find_capability(dev, PCI_CAP_ID_MSI);
1762306a36Sopenharmony_ci	if (!dev->msi_cap)
1862306a36Sopenharmony_ci		return;
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci	pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &ctrl);
2162306a36Sopenharmony_ci	if (ctrl & PCI_MSI_FLAGS_ENABLE) {
2262306a36Sopenharmony_ci		pci_write_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS,
2362306a36Sopenharmony_ci				      ctrl & ~PCI_MSI_FLAGS_ENABLE);
2462306a36Sopenharmony_ci	}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	if (!(ctrl & PCI_MSI_FLAGS_64BIT))
2762306a36Sopenharmony_ci		dev->no_64bit_msi = 1;
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_civoid pci_msix_init(struct pci_dev *dev)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	u16 ctrl;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	dev->msix_cap = pci_find_capability(dev, PCI_CAP_ID_MSIX);
3562306a36Sopenharmony_ci	if (!dev->msix_cap)
3662306a36Sopenharmony_ci		return;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	pci_read_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS, &ctrl);
3962306a36Sopenharmony_ci	if (ctrl & PCI_MSIX_FLAGS_ENABLE) {
4062306a36Sopenharmony_ci		pci_write_config_word(dev, dev->msix_cap + PCI_MSIX_FLAGS,
4162306a36Sopenharmony_ci				      ctrl & ~PCI_MSIX_FLAGS_ENABLE);
4262306a36Sopenharmony_ci	}
4362306a36Sopenharmony_ci}
44